【问题标题】:Read file line by line and do regex replace逐行读取文件并进行正则表达式替换
【发布时间】:2015-02-21 22:55:08
【问题描述】:

我编写了一个程序,它将文本文件读入变量,对文本进行正则表达式替换,然后将其写回文件。显然,这对于大型文本文件是不可扩展的;我希望能够逐行读取文本文件并对所需模式进行正则表达式替换。

这是我的不可扩展代码:

static void Main(string[] args) {
    var fileContents = System.IO.File.ReadAllText("names.txt");
    string pattern = "Ali";
    string rep = "Tyson";

    Regex rgx = new Regex(pattern);
    fileContents = rgx.Replace(fileContents, rep);

    System.IO.File.WriteAllText("names.txt", fileContents);}

我知道如何使用 StreamReader 逐行读取文件,但是当我尝试在 StreamReader 中嵌套 StreamWriter 以便在逐行搜索时写入文件时遇到了未处理的异常错误。

有人知道怎么解决吗?

【问题讨论】:

  • 必须是RegEx.Replace 你熟悉string.Replace() 方法吗?你能不做以下var fileContents = System.IO.File.ReadAllText("names.txt");fileContents = fileContents.Replace("Ali", "Tyson");
  • 我希望这不言而喻...您写入的文件与读取的文件不同吗?
  • 你是说你想逐行读取一个文件并做一个正则表达式替换内联(修改你正在阅读的同一个流)?如果是这样,请不要这样做。相反,从一个文件读取,将结果写入另一个文件,最后进行文件复制/重命名以覆盖原始文件。
  • 有,但您不想这样做,因为如果您犯了错误或遇到错误,您的数据将被永久销毁。如果您想一次性替换大文件中的文本,请咨询Large single-file parse
  • @StewC,是的,您可以使用FileStream (msdn.microsoft.com/en-us/library/…),但这并不简单,因为匹配文本的大小不一定与替换的大小匹配文本,这意味着您将在逐行工作时从上到下反复重写文件。最好只使用两个文件,一个用于读取,一个用于写入。

标签: c# regex file-io scalability


【解决方案1】:

你可以试试这个,

using (var input = File.OpenText("input.txt"))
using (var output = new StreamWriter("output.txt")) {
  string line;
  while (null != (line = input.ReadLine()) {
     // Apply regex to line before writing to new outpu file
     output.WriteLine(line);
  }
}

完成对 output.txt 的所有行的读取和写入后,您可以将 input.txt 替换为 output.txt。

【讨论】:

  • 这行得通。尽管有用输出文件替换输入文件的额外步骤,但看起来这是在 C# 中执行此任务的最简单方法。谢谢。
  • @StewC 很高兴它帮到了你。
  • 您可以将其作为单行执行:File.WriteAllLines("output.txt", File.ReadLines("input.txt").Select(l => rgx.Replace(l, rep)));
猜你喜欢
  • 1970-01-01
  • 2019-01-12
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 2022-12-24
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
相关资源
最近更新 更多