2016-07-25 15 views
0

何百万ものレコードを持つテキストファイルを読み込む必要があります。ファイルを読みながら "Tracker"のようなものを実装する必要があります。最後にLineNumberを読み込んでログファイルに書き出します。このログファイルを開いて書き込み操作をアプリケーションのパフォーマンスに影響させたくありません。誰も私にそれを実装する方法を提案することができますか? P.P.私はこの大きなファイルを読むために歩留まりを使用しています、そして私はそのような複数のファイルを持っています。私はファイルがいくつかの無効なレコードを持っている場合、操作の読み込みを停止したい...この読み込み操作が行われている間、私は何とか今までに読んでいたので、 。ファイルへの書き込み操作

using (StreamReader reader = new StreamReader(_fileNameAndPath)) 
       { 
        while (reader.EndOfStream == false) 
        { 
         string data = reader.ReadLine(); 

         _fileLineNumber = _fileLineNumber + 1; 
    //this line number should go to tracker file Logger.Trace(_fileLineNumber) 

         //............ 
        } 
       } 

Loggerクラス:

public static class Logger 
{  
     ..... 
     public static void Trace(string message) 
     { 
      FileStream fileStream = new FileStream(logFilePath, FileMode.Append); 
      StreamWriter streamWriter = new StreamWriter(fileStream); 
      streamWriter.WriteLine(message); 
     } 

} 
+0

ストリームは、アプリケーション全体またはストリームを開いたままにしておいてください。 AKAは静的なロガーを持っていません - それを挿入してください –

+3

本当に 'Logger.Trace()'の実装ですか?あなたがファイルストリームを閉じていないので... –

+0

プログラムが終了したときに最後に読んだ行の番号を記録する必要がありますか、または読み込んだ各行を文書化する必要がありますか? – falx

答えて

0

あなたがループを終了した後、それを閉じ、その後、あなたはループに入る前に、それを開いて、クラスレベルのプライベートフィールドとして、あなたのファイルストリームを格納することができます。

いっそ、LoggerIDisposableを実装し、using文の中にあなたのループをラップし、すべてのクリーンアップが自動的に行われます:

ここ
public class Logger : IDisposable 
{ 
    private FileStream fileStream; 
    private StreamWriter streamWriter; 

    public void Trace(string message) 
    { 
     streamWriter.WriteLine(message); 
    } 

    public Logger(string logFilePath) 
    { 
     fileStream = new FileStream(logFilePath, FileMode.Append); 
     streamWriter = new StreamWriter(fileStream); 
    } 

    public void Dispose() 
    { 
     streamWriter.Dispose(); 
     fileStream.Dispose(); 
    } 
} 

はあなたが持っているコード内でそれを使用する方法であります:

var logFilePath = ""; // replace this with however you get your log path. 

using (var logger = new Logger(logFilePath)) 
{ 
    while (reader.EndOfStream == false) 
    { 
     string data = reader.ReadLine(); 
     _fileLineNumber= _fileLineNumber + 1; 
     logger.Trace(_fileLineNumber); 
    } 
} 
0

明らかに、私はあなたが本当に作るしようとしているのか分からないが、私はそのログのものを保存するための最良の方法は、あなたの全体のプロセスの後にファイルを書き込むことがあるとします。したがって、数の配列を作成し、その配列が格納されるとその配列が格納されます。

var readLines = new List<number>(); 

using (StreamReader reader = new StreamReader(_fileNameAndPath)) 
{ 
    while (reader.EndOfStream == false) 
    { 
     string data = reader.ReadLine(); 
     readLines.Add(_fileLineNumber); 

     _fileLineNumber = _fileLineNumber + 1; 
    } 
} 

Logger.Trace(readLines.ToString()); 
+0

ご迷惑をおかけして申し訳ございません...追加のコメントをお読みください – bansi

関連する問題