【问题标题】:replacing \n with \r\n in a large text file在大文本文件中用 \r\n 替换 \n
【发布时间】:2011-09-18 21:22:39
【问题描述】:

我有一个包含很多 \n 的大文本文件,我需要将其替换为 \r\n。对于小文本文件,我使用 ReadToEnd 方法将文件作为字符串获取,然后使用 Replace 方法,然后将字符串写入文件。但是,对于一个大文件,由于字符串太大,我得到了 OutOfMemory 异常。任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 您需要将生成的文件放在内存中,还是返回到磁盘中?

标签: c# text replace


【解决方案1】:

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】:
    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”。

    【讨论】:

      【解决方案3】:

      您可以使用Read 并指定每次读取多少字节。例如以 10 MB 块读取文件。

      【讨论】:

        【解决方案4】:

        或者,如果您需要更大的缓冲区,您可以使用StreamReader.ReadBlock();

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-03-31
          • 2013-05-02
          • 2011-01-23
          • 1970-01-01
          • 2011-03-04
          • 1970-01-01
          • 2015-09-22
          相关资源
          最近更新 更多