ファイルの読み込みについて

タグの編集
投稿者 ルキノ  (社会人) 投稿日時 2010/4/29 15:08:14
テキストファイルのテキストを指定した行の部分だけ読み込むにはどうしたらいいのでしょうか?
例えば↓のテキストがあって、3行目の「さしすせそ」だけを読み込みたいのです
あいうえお
かきくえこ
さしすせそ
たちつてと
投稿者 るきお  (社会人) 投稿日時 2010/4/29 16:28:39
こんにちは。

VB(やC#)には行を指定してファイルを読み込む機能はないので、
先頭から目的の行に達するまで1行ずつ読んでいく方式になります。

シンプルに書くと次のようになります。
    
Dim reader As New IO.StreamReader("C:\Test\Text1.txt")
Dim line As String

line = reader.ReadLine '1行目 
line = reader.ReadLine '2行目 
line = reader.ReadLine '3行目 

reader.Close()

MsgBox("3行目は" & vbNewLine & line & vbNewLine & "でした。")


ただ、これだと融通が利かないうえ、100行目などになると大変なので多少工夫してループで取得する方が良いと思います。

   
Dim reader As New IO.StreamReader("C:\Test\Text1.txt")
Dim line As String = ""

For lineNumer As Integer = 1 To 3
    line = reader.ReadLine
Next

reader.Close()

MsgBox("3行目は" & vbNewLine & line & vbNewLine & "でした。")


でも、多くのプログラマはさらに進んでこの処理を関数化し、必要な場合には関数を1行呼び出すだけにすると思います。私もこの方式を採ります。
   
Private Function ReadFileLine(ByVal fileName As StringByVal lineNumber As IntegerAs String

    Dim reader As New IO.StreamReader(fileName)
    Dim line As String = ""

    For lineNumer As Integer = 1 To lineNumber
        line = reader.ReadLine
    Next

    reader.Close()

    Return line

End Function


このようにしておけば、使用する箇所ではファイル名と行数を指定するだけです。
   
Dim line As String = ReadFileLine("C:\Test\Text1.txt", 3)
MsgBox("3行目は" & vbNewLine & line & vbNewLine & "でした。")


他にも場合によっては違うことをやるかもしれません。
たとえば、テキストの行数がかなり少ないことがわかっていて、個人で使用する用のプログラムを作っているのであれば次のように書いてしまうこともできます。

    
Dim line As String = IO.File.ReadAllLines("C:\Test\Text1.txt")(2)
MsgBox("3行目は" & vbNewLine & line & vbNewLine & "でした。")


この方法は書くのは簡単なのですが、実行すると内部では対象のテキストファイルを1回すべて読み込んでメモリ上に展開してしまいます。だから巨大なファイルからたった1行を取得したい場合は、そのたった1行のためにメモリを消費してファイルを読み込んでしまいます。

「個人で使用する用」と書いたのは、業務用の場合、対象が小さなファイルだとわかっていても使用しないで済むメモリや読み込みは抑えたいので、この方式は業務用ではちょっと微妙ということです。
投稿者 ルキノ  (社会人) 投稿日時 2010/4/29 20:27:41
るきおさんレスありがとうございます。
多種類のサンプルを用意していただき驚いてます。
私は関数化されたサンプルを使用し、無事目的の処理をさせることができました。
ありがとうございました。