2011-06-20 16 views
2

大文字のテキストファイルがあります。大量の\ nを\ r \ nで置き換える必要があります。小さなテキストファイルでは、ReadToEndメソッドを使用してファイルを文字列として取得し、Replaceメソッドを使用して文字列をファイルに書き込みました。しかし、大きなファイルでは、文字列が大きすぎるためOutOfMemory例外が発生します。どんな助けでも大歓迎です。ありがとう。大文字のファイルで nを r nに置き換えます

+0

あなたは背中に結果のメモリ内のファイル、またはが必要ですディスク? – Dialecticus

答えて

6
private void foo() { 
     StreamReader reader = new StreamReader(@"D:\InputFile.txt"); 
     StreamWriter writer = new StreamWriter(@"D:\OutputFile.txt"); 
     string currentLine; 

     while (!reader.EndOfStream) { 
     currentLine = reader.ReadLine(); 
     writer.Write(currentLine + "\r\n"); 
     } 
     reader.Close(); 
     writer.Close(); 
    } 

これで問題が解決するはずです。注意してください、そのreader.ReadLine()は後続の "\ n"を切り捨てます。

1

それとも、より大きなバッファのような必要がある場合、あなたはあなたがReadを使用し、各時間を読み取るためにどのように多くのバイト数を指定することができStreamReader.ReadBlock();

2

を使用することができます。 10 MBのチャンクでファイルを読み込むなど。

3

DiableNoirのソリューションは正しい考えですが、実装はバグであり、何らかの説明が必要です。ここでは改善一つだ:

using (var reader = new StreamReader(@"D:\InputFile.txt")) 
using (var writer = new StreamWriter(@"D:\OutputFile.txt")) // or any other TextWriter 
{ 
    while (!reader.EndOfStream) { 
     var currentLine = reader.ReadLine(); 
     writer.Write(currentLine + "\r\n"); 
    } 
} 

あなたは(この1つは、ファイルまたはメモリ内の文字列に指示される場合があります)、入力と出力のためのTextWriterためTextReaderを使用しています。 reader.ReadLineは、行末を行の一部として返すので、明示的に書き込む必要があります(string.Replaceを使用する代わりに、何も実行できません)。

あなたがcurrentLineの一部として\nまたは\rを見ることはありませんので、また、まさに、このプログラムは、それが生産している出力で再度実行しても安全である(この場合には、その出力がその入力に全く同じになります)。 currentLineは行末が含まれている場合、それは、\r\nに初めて\nを変更し、それ\r\r\n二度目になるだろうので、これは、ケースではないでしょうなど

関連する問題