2009-04-27 10 views
1

私はC#を初めて使っています。 私はいくつかのディレクトリの下でコードファイルの束を開き、いくつかの一致する文字列を含む特定の行を取得する必要があります。 それは単純な問題です、私はストリームリーダーを使用してファイルを1つずつ開いて、1行ずつ解析することができます。 私は同じことをするより効率的な方法があるのだろうかと思っていた。私は、ストリームリーダとラインごとの読取りが重い操作であるという印象を受けているようです。C#ファイルの内容を読み込んで文字列を見つける

答えて

0

ファイルの内容全体を調べる必要がある場合は、すべての行を読み込む必要があります。 ReadLine()は、それと同じように良い方法です。

あなたはあなたのファイルの各行を含む配列を与える()StreamReader.ReadToEnd()

1

File.ReadAllLinesを使用して、一度にファイル全体の内容を読み取ることができます。あなたがファイルの途中で読書を停止することができる場合、これはもっとうまくいくかもしれません。もしそうでなければ、それはあなたにIOで時間を節約するかもしれません(個々のIO呼び出しが少なくなりますが、これは単なる推測です)。

本当に心配な方は、プロファイラを使用するか、ベンチマークを作成してください。それ以外の場合は、読みやすい方法を使用してください。

0

ReadToEnd()メソッドは実際にはLoC(コード行)の点で効率的ですが、パフォーマンスが懸念される場合は基本的にファイルの内容全体をメモリにロードするので注意が必要です(文字列)。ファイルサイズが非常に大きい場合は、間違いなくパフォーマンスにヒットします。

5

すでにファイルの行を取得する方法については、いくつかの良い記事がありますので、私は効率について少しは追加すると思っていました。いくつかの人がFile.ReadAllLines()メソッドについて言及しています。この方法は、ファイル全体を一度にメモリに読み込むため、効率的には問題があります。さらに、連続したメモリを必要とするストレージとしての配列を使用します。ファイルが十分に大きければ、問題が発生します。

ファイルをより効率的に読み取るには、StreamReader.ReadLineメソッドを繰り返し使用します。一度に1行ずつ返すので、気にする行はメモリ内に保存するだけで済みます。イテレータを評価する遅延にするのも比較的簡単です。

public static IEnumerable<string> ReadLinesEnumerable(string path) { 
    using (var reader = new StreamReader(path)) { 
    var line = reader.ReadLine(); 
    while (line != null) { 
     yield return line; 
     line = reader.ReadLine(); 
    } 
    } 
} 

LINQに関しては、 LINQを使用すると、ReadAllLinesメソッドとReadLinesEnumerableメソッドの両方を等しく一致させることができます。これは、両方とも列挙可能なデータ型を返すためです。たとえば

var query = from line in ReadLinesEnumerable(@"c:\some\path\file.txt") 
      where Regex.IsMatch(line, @"^(\d)+.*$") 
      select line; 
+0

これは優れた方法です。 –

関連する問題