在c#中替换文本文件中特定行的最佳方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在c#中替换文本文件中特定行的最佳方法相关的知识,希望对你有一定的参考价值。

对于以下操作:

  1. 打开文本文件
  2. 使用新字符搜索并替换所有搜索字符

我想在c#中实现上述目标,这是我的代码:

using (StreamReader sr = new StreamReader(@"S:Personal FoldersATESTA.txt"))
{
    using (StreamWriter sw = new StreamWriter(@"S:Personal FoldersATESTB.txt"))
    {
        string line;

        while ((line = sr.ReadLine())!= null)
        {               
            if (!line.Contains("before"))
            {
                sw.WriteLine(line);
            }

            else if (line.Contains("before"))
            {
                sw.WriteLine(line.Replace("before", "after"));
            }
        }
    }
}

基本上,上面的代码将生成一个带有所需替换操作的新文件,但正如您所看到的,我正在做的方法是读取原始文件的每一行并写入新文件。这可以实现我的目标,但它可能有系统IO问题,因为它是为每一行读写。另外,我无法首先读取所有行到数组,然后写入,因为文件很大,如果我尝试写入string[],替换all,然后将数组写入文件,将导致内存超时问题。

有什么方法可以找到具体的线路,只需更换这些线路并保留其余部分?或者解决上述问题的最佳方法是什么?谢谢

答案

我不知道你担心的IO问题,但你的代码应该可以正常工作。您可以更简洁地编写代码,如下所示:

using (StreamReader sr = new StreamReader(@"S:Personal FoldersATESTA.txt"))
{
    using (StreamWriter sw = new StreamWriter(@"S:Personal FoldersATESTB.txt"))
    {
        while ((string line = sr.ReadLine())!= null)
        {
            sw.WriteLine(line.Replace("before", "after"));
        }
    }
}

这会运行得更快,因为它每行只搜索一次“之前”。默认情况下,StreamWriter会缓冲您的写入,并且每次调用WriteLine时都不会刷新到磁盘,并且文件IO在操作系统中是异步的,因此不要过于担心IO。

另一答案

一般来说,你正在做的是正确的,可能后面有一些重命名来替换原始文件。如果确实要替换原始文件,则应将原始文件重命名为临时名称,将新文件重命名为原始名称,然后保留或删除原始文件。您必须处理与临时名称的冲突以及所有重命名中的错误。

考虑你用五个字符的字符串替换六个字符的字符串 - 如果你回写原始文件,你会用额外的字符做什么?文件作为原始数据字节存储在磁盘上,磁盘上没有“文本”文件。如果用较长的字符串替换字符串会怎么样 - 然后可能必须移动文件的其余部分以腾出空间来写更长的行。

您可以将磁盘上的文件想象成在方框中的方格纸上写的字母。每行的结尾用特殊字符(或字符 - 在Windows中,即CRLF)标记,字符水平填充所有框。如果您试图替换方格纸上的文字,则必须删除并重写大量字母。在新表上书写将是最简单的。

另一答案

好吧,你的方法基本上没问题...但我不会检查该行是否包含单词before ...权衡不够好:

using (StreamReader sr = new StreamReader(@"S:Personal FoldersATESTA.txt"))
{
    using (StreamWriter sw = new StreamWriter(@"S:Personal FoldersATESTB.txt"))
    {
        String line;

        while ((line = sr.ReadLine()) != null)
            sw.WriteLine(line.Replace("before", "after"));
    }
}
另一答案

试试以下:

else if (line.Contains("before"))
{
    sw.WriteLine(line.Replace("before", "after"));
    sw.Write(sr.ReadToEnd());
    break;
}

以上是关于在c#中替换文本文件中特定行的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

将一个文件中的不同文本行插入到一组文件中的特定行的最佳方法[关闭]

在 C 中读取和打印 .txt 文件行的最清晰方法

替换第一列文本中的特定字符

在 SwiftUI 中装饰文本片段的最佳方法是啥?

在 MySQL 中计算特定日期之间数百万行的最佳方法

如何在实时代码应用程序中的Mac OS X上收听特定的文本字符串