我有一个很大的文本文件\ n我需要用\ r \ n替换。使用小文本文件,我使用ReadToEnd方法将文件作为字符串获取,然后使用Replace方法,然后将字符串写入文件。但是,对于一个大文件,我得到一个OutOfMemory异常,因为字符串太大了。任何帮助将不胜感激。感谢。
答案 0 :(得分: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 :(得分: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
或\r
视为currentLine
的一部分,所以此程序可以安全地在其生成的输出上运行(在这种情况下,它的输出将与其输入完全相同)。如果currentLine
包含行结尾,则情况并非如此,因为它会在第一次将\n
更改为\r\n
,然后第二次将其设为\r\r\n
,等等
答案 2 :(得分:2)
您可以使用Read并指定每次要读取的字节数。比如以10 MB的块读取文件。
答案 3 :(得分:1)
或者,如果您需要更大的缓冲区,可以使用StreamReader.ReadBlock();