2009-07-09 4 views
1

私はC#/ .NETで作業しています。ファイルを解析して、ある行が特定の正規表現に一致するかどうかを調べています。実際には、最後のという行が見つかりました。StreamReader.ReadLine()ストリームの最後から始まる

私のファイルの行を取得するには、現在System.IO.StreamReader.ReadLine()メソッドを使用していますが、ファイルが非常に大きいので、少しコードを最適化して終了から開始したいと思いますファイルの

ストリームの終わりから始まるReadLine()と同様の機能がC#/ .NETにあるかどうか知りませんか?そしてもしそうでなければ、あなたの心には、上記の仕事を行う最も簡単で最適な方法は何でしょうか?

答えて

6

面白いと言えばいいのですが、そうです。私は少し前にReverseLineReaderと書いて、それをMiscUtilに入れました。

これは、スタックオーバーフローのthis questionに答えました。答えにはMiscUtilの他のビットも使用されていますが、コードが含まれています。

エンコーディングには対応しますが、必要なものはすべてうまくいきます。ファイル全体を読む必要がある場合は、ファイルの先頭から読み込むよりも効率が悪くなります。すべての種類のものがファイルを順方向に動くようになるため、最適化されます。しかし、あなたは実際にはファイルの終わり近くにラインを読んでいるならば、これは大きな勝利:)

可能性があり(これはちょうど近い票か...されている必要があるかどうかわからない)

+0

誰もが閉じることや捨てることを忘れることができます。 :) – MusiGenesis

+1

あなたのLineReaderがどれほど徹底的に徹底しているか+1。この資料を利用できるようにしてくれてありがとう<3 – womp

+0

OK答えははいです簡単な方法があります:Jonのコードをコピーして貼り付けてください:)ありがとう – PierrOz

0

正規表現を使用しているので、最良の選択肢は、行全体をメモリに読み込んで一致させることです。

おそらく、正規表現とファイルの内容のサンプルを提供すると、問題を解決するためのより良い方法が見つかるはずです。

0

"最も簡単" -vs- "最適化された" ...私はあなたが両方を取得するとは思わない。

ファイルを開いて各行を読むことができます。あなたの基準に合ったものを見つけるたびに、それを変数に保存します(以前のインスタンスを置き換えます)。終了すると、最後に一致する行が表示されます。

FileStreamを使用して、ファイルの末尾付近の位置を設定することもできます。上記の手順を実行し、一致するものが見つからない場合は、一致するファイルが見つかるまでFileStreamの位置をファイルの先頭に設定します。

0

これは、あなたが探している、それはあなたが必要なもののためにメモリ重いかもしれない何をするべきであるが、私はあなたのニーズがその領域にあるかわからない:それはまだ必要となる

 string[] lines = File.ReadAllLines("C:\\somefilehere.txt"); 
     IEnumerable<string> revLines = lines.Reverse(); 
     foreach(string line in revLines) { 
      /*do whatever*/ 
     } 

最初はすべての行を読んでいますが、それを行うときにはそれぞれの行をチェックするよりも速いかもしれません。

+0

私はそれがうまくいくとは思わない。メモリがオブジェクトでない場合(メモリのファイルサイズが2倍必要)、EOLのペアは後方になります。 CR - LFはLF - CRと表示されます。 ReadLineは何も見つかりませんでした。 –

+0

あなたは正しいと思う...あまりにも速すぎると思った。 –

+0

そこに..私は少し良く働くために私の答えを更新しました。 lmao。ごめんなさい。 –

関連する問題