D:\Temp\ForGrep.txt
Ah Love! could you and I with Fate conspire
To grasp this sorry Scheme of Things entere,
Would not we shatter it to bits -- and then
Re-mould it nearer to the heart's Desire!
このようなファイルを読み込んで出力する演習をしています。
' ==============================
' 全ての行を読み込んで出力する
' ==============================
Module theGrap
Sub Main()
Dim iNow As Integer = 0
Dim iNext As Integer = 0
Do
iNow = iNext
Debug.Print(ReadLine("D:\Temp\ForGrep.txt", iNow, iNext))
Loop Until iNext = -1
End Sub
End Module
ReadLine 関数でファイルの先頭0バイト目から1行を読み込む。
ReadLine 関数は、次の行が存在する可能性があれば次の行の開始バイトを iNext に代入。
ReadLine 関数は、次の行が存在しなければ iNext には -1 を代入。
聞きたいのは、あるポジションから1文字づつ行末まで読み込む方法です。
' ----------------------------------------
' ファイルから指定位置の1文字を読み込む
' ----------------------------------------
Private Function GetString(ByVal fs As FileStream, _
ByVal iPP As Integer) As String
Dim c As String = ""
Dim d As String = ""
Dim Buf(1) As Byte
Dim ec As Encoding = Encoding.Default
' --------------------------------
' 指定の位置より2バイト読み込む
' --------------------------------
fs.Seek(iPP, SeekOrigin.Begin)
fs.Read(Buf, 0, Buf.Length)
c = ec.GetString(Buf)
' ----------------------------------------------
' 指定の位置より1バイト戻って2バイト読み込む
' ----------------------------------------------
If iPP > 0 Then
fs.Seek(iPP - 1, SeekOrigin.Begin)
fs.Read(Buf, 0, Buf.Length)
d = ec.GetString(Buf)
End If
Return If(d.Length = 1, d, c.Substring(0, 1))
End Function
今、私は、このように非常にややこしい手順で1文字づつ読み込んでいます。
なんか、とんでもない無駄なことをしているような気がします。
多分、同じことが1行で出来るんではないかと思います。
「そんなややこしいことをしなくて、このようなやり方で」を教えて下さい。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
こんにちは、
表題とは違いますが。
>このようなファイルを読み込んで出力する演習をしています。
ここの部分に着目して、
>多分、同じことが1行で出来るんではないかと思います。
ここの部分から、以下のコードを書きました。
Module Module1
Sub Main()
Dim fn As String = "C:\Documents and Settings\*****\My Documents\*****\goo_teach.txt"
Dim line As String = My.Computer.FileSystem.ReadAllText(fn)
Console.WriteLine(line)
End Sub
End Module
問題の英文の入っているファイルの名(goo_teach.txt)を、
読み込んで、コンソールに、すべて出力します。
ファイルに入っている文字が、全部変数lineに入っているので、
目的の文字を探したいなら、lineから、
探せばいいかと思いますが。
こんなことですか???
VB.Net とやらを知って50日。
ともかく、色んな手法があって当惑。
組み込み関数にMyなどなど。
初学者の私は、余りのメニューの多さに幻惑されっぱなし。
で、でも、マイクロソフトの厨房では .Net ライブラリが盛り付けられているだけのよう。
そういう事情なら、私も、組み込み関数とかMyとかは演習対象から除外しました。
で、今は、あくまでも .Net ライブラリが関心事です。
ど素人は、それほどに「あっちも、こっちも」という余裕はありません。
この辺りをご理解下さい。
さて、.Net ライブラリにターゲットを絞る大見栄をきっても固定長ファイルだけは別。
しかし、非固定長ファイルは、StreamReaderとTextReaderとが演習対象。
そういう結論に達しました。
で、質問は、My.Computer.FileSystemや組込関数のGetLineメソッド(あればですが)の自作。
そういうことですので宜しくお願いします。
No.2
- 回答日時:
すまん、勘違いした。
撤回。全容を示ます。
Module mdlFileSystem
Function ReadLine(ByVal aFile As String, _
ByVal iNowPosition As Integer, _
ByRef iNextPosition As Integer) As String
Dim aChar As String
Dim aChars As String = ""
If File.Exists(aFile) Then
Try
Using fs As FileStream = New FileStream(aFile, FileMode.Open, FileAccess.Read)
Do
aChar = GetString(fs, iNowPosition)
If aChar <> Chr(13) Then
aChars &= aChar
Else
iNowPosition = iNowPosition - 1
Exit Do
End If
iNowPosition += txt.LenB(aChar)
Loop While iNowPosition < fs.Length And aChar <> Chr(13)
iNextPosition = NextPosition(fs, iNowPosition)
fs.Close()
Return aChars
End Using
Catch ex As IOException
MsgBox(ex.Message & "(ReadLine)", , "告知:")
Return ""
End Try
Else
Return ""
End If
End Function
Private Function NextPosition(ByVal fs As FileStream, ByVal iP As Integer) As Integer
If (GetString(fs, iP + 2) = Chr(10) Or GetString(fs, iP + 2) = Chr(13)) And (GetString(fs, iP + 1) = Chr(10) Or GetString(fs, iP + 1) = Chr(13)) Then
iP += 3
ElseIf GetString(fs, iP + 2) = Chr(10) Or GetString(fs, iP + 2) = Chr(13) Then
iP += 2
Else
iP = -1
End If
Return iP
End Function
Private Function GetString(ByVal fs As FileStream, ByVal iPP As Integer) As String
・・・・・
End Function
End Module
No.1
- 回答日時:
そろそろコードは不要でマニュアルだけで十分かなあ。
http://msdn.microsoft.com/en-us/library/x8xxf0x5 …
http://msdn.microsoft.com/en-us/library/system.i …
iNextPosition が -1 であるべき時になっていないなどのバグがあります。
が、問題はあくまでも「ファイルから指定位置の1文字を読み込む」です。
「.NET の開発者達が英語圏だから仕方ないのじゃないの!」
という感想でも構いません。
宜しくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
シェルコマンドの 2>&1 とはど...
-
ファイル出力の場所を指定
-
Acccess レポートをグループ別...
-
VBAでエクセルをCSVに変換時
-
VC++でUTF-8のファイルを出力し...
-
VBA でメモ帳へ保存する際の保...
-
Accessでのレポート印刷待機方法
-
pcap形式データをテキストへ抽出
-
VBSでEXCEL⇒CSV変換で日付の書...
-
C言語のプログラムが異常終了し...
-
CSV形式に変換
-
C言語で16進数をテキスト出力し...
-
1行ずつではなくまとめてファイ...
-
出力をExcelにすることは可能??
-
(VBA)書式が変更されてしまい...
-
gnuplotでreplotできない??
-
エクセルVBA→シート名でCSV出力...
-
VCでの外部アプリ操作
-
コンソールの出力をパイプでダ...
-
サーバー上でのtxtをPDFに変換
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンド(例えばls)の出力結果...
-
ファイル出力の場所を指定
-
VC++でUTF-8のファイルを出力し...
-
テキストファイルに改行コード...
-
シェルコマンドの 2>&1 とはど...
-
Acccess レポートをグループ別...
-
Wordマクロで指定したフォルダ...
-
二次元配列をクリップボードに...
-
ファイル形式またはファイル拡...
-
CreateProcess関数と実行後の戻...
-
fortranのtxtファイル出力書式...
-
サウンド出力のデバイスを選択...
-
VBA でメモ帳へ保存する際の保...
-
1行ずつではなくまとめてファイ...
-
VBSでEXCEL⇒CSV変換で日付の書...
-
C++ fprintf_sの使い方がわからん
-
ファイルの文字コードをUTF-8に...
-
pLaTeX の EPSファイル読み込み...
-
AccessVBA複数レポート条件毎に...
-
フォルダにあるPDF情報の抽出(VBA)
おすすめ情報