- ベストアンサー
テキストファイルを後ろから読む方法(VB2008)
やりたいことを先に書くと、最終的には Linuxのtailに毛が生えたようなアプリをつくりたいと思っています。 開発環境はVB2008 Express Editionです。 で、まずはテキストファイルを後方から読む方法でつまっています。 指定した行数を後方から読むようにしたいと思っています。 最初は全行をいったん読み込んで配列に入れて処理という 書き方をしたのですが、大きなファイルの際にメモリを大量に消費し、 処理速度も遅くなったのでボツになりました。 今はとりあえず、バイナリで後ろから読み込んで改行文字列を 自分で見つけて処理をするという原始的な方法を思い浮かべていますが、 今っぽくないプログラミングであるような気がしています。 このようなことを実現する便利なクラス・機能やエレガントな記述等を 教えていただきたいと思っています。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
FileStreamからバイナリデータとして読み込んで文字列の配列に読み込むといった具合でしょう dim Buf( 1023) as Byte FileStreamのSeekメソッドでファイルの末尾へ移動 ... 1) Seekで読み取りバッファ分だけファイルの先頭側へ移動 ... 2) Read(Buf, 0, Buf.Length)で読み込み CR(&H0D)やLF(&H0A)を探しながら BufをLength-1から0へ向けて検索および文字列化 ... 3) 希望の行数未満の場合は1)へ戻って 2)を繰り返し回数分戻して繰り返す といった具合でしょう 3)の文字列化ですが UnicodeのファイルならSystem.Text.Encoding.Unicodeで Shift_JIS(含むANSI)などのファイルならSystem.Text.Encoding.Defaultなどで変換が必要でしょう
その他の回答 (1)
- Gab_km
- ベストアンサー率40% (20/50)
あんまりエレガントではありませんが、以下のようなやり方をあげておきます。 (参考URL:ファイルを1行ずつ読み込む方法) (1)String型変数を指定数だけ配列で用意しておきます。(要素数不定なので、引数などから要素数を決めてあげる必要があります) (2)1行読み込みの結果を、この配列に天下り的に退避します。(最初は1番目に格納、次は1番目を2番目に退避して・・・) (3)EOFになったら読み込みを終わるようにすると、配列に入っているのが最終行から指定行分の文字列になる。 取り急ぎで動作確認はしていないので、上手くいかなかったら申し訳ありません。
お礼
ありがとうございます。 この方法なら確かに結果としてメモリを圧迫せずに後方の行のみを取得できますね。 しかし、tailのような機能にしようと思っているのでリアルタイムにファイル監視を行います。ので、ファイルに書き込みが行われるたびに全体を読み直すのは好ましくありません。 数百Mバイトのログファイルでの使用にも耐えられる仕様にしたいと思っています。