2011-06-20 93 views
2

我有一個很大的\ n需要用\ r \ n替換的大文本文件。對於小文本文件,我使用ReadToEnd方法將文件作爲字符串獲取,然後使用Replace方法,然後將字符串寫入文件。然而,對於一個大文件,我會得到一個OutOfMemory異常,因爲這個字符串太大了。任何幫助將不勝感激。謝謝。用大文本文件中的 r n替換 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

或者,如果你需要像一個更大的緩衝區,你可以使用StreamReader.ReadBlock();

2

你可以使用Read並指定多少字節,每次讀。如以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"); 
    } 
} 

您使用輸入TextReader和輸出TextWriter(這個可能會直接到文件或內存中的字符串)。 reader.ReadLine而不是返回行結束作爲行的一部分,所以你需要明確地寫(而不是使用string.Replace,這將不會完成任何事情)。

而且,正是因爲你永遠不會看到\n\rcurrentLine一部分,該計劃是安全的,它已經產生的輸出再次運行(在這種情況下,它的輸出將是完全相同的輸入)。這不會是這種情況,如果currentLine包括行結束,因爲它會改變\n\r\n第一時間,然後使其\r\r\n第二時間等