テキストファイルの任意の行を読み込む方法


ぽんきち  2008-09-03 14:20:28  No: 145154  IP: 192.*.*.*

お世話になります。表題どおりなのですが、ボリュームのあるテキストファイル(100万行くらい)の1行目と最終行だけが必要なのです。
行数数えて判断させる以外になにかよい方法はないものでしょうか。
よろしくご教示ください。
vs2008・vista環境です。

編集 削除
 2008-09-03 15:21:31  No: 145155  IP: 192.*.*.*

簡単な方法は無いはず

1行目を読むのは簡単なので置いておくとして
最終行だけ読むのは…例えば
1.FileStreamを使ってファイルを開く
2.Lengthプロパティ(で いいんだっけ?)でファイル長を調べる
3.Seek, Readの各メソッドで、最後尾から1バイトずつ取得して、
  Byte型の動的配列に、配列を広げながらセットしていく
4.上記のデータで、&h0A(LF) を取得して、その直後に &h0D(CR) を
  取得した場合(逆に読んでいるので、実際のデータは &h0D0A)は、
  そこを改行とみなし、&h0A, &h0D は配列にセットせずに読み込み終了
  (&h0A だけの判定でもいいかもしれない)
5.Byte型動的配列を Array.Reverse で反転
  (逆並びだったのを順並びにする)
6.System.Text.Encodingのインスタンスを、
    Dim enc As Encoding = Encoding.GetEncoding("shift_jis")
  みたいな感じで定義して、Shift-JISを変換できるようにする
7.6で作ったインスタンスを使って、Byte配列をStringに変換
  例えば
    Dim st as String = enc.GetString(dat)
  (ここの dat は、Byte型動的配列)
…とか やれば、何とかなるかも

編集 削除
 2008-09-03 15:47:21  No: 145156  IP: 192.*.*.*

あ、上の4で「&h0Aだけでもいいかも」と書いたけど
やっぱ全角文字とかで&h0Aがあるとマズイから
2バイトで判断した方がいいかも?
(IMEパッドで少し見てみたら、シフトJISで&h0Aを使った全角の定義は
  回避してるようにも見えるけど…責任は持てないので)

編集 削除