如何在同一文件中优雅地实现多个字符串替换?

本文关键字:实现 字符串 替换 文件 | 更新日期: 2023-09-27 17:49:44

目前我有一些代码来替换文件中的字符串,看起来像这样:

File.WriteAllText(filePath, Regex.Replace(File.ReadAllText(filePath),
    "( " + column.Key + " )",
    " " + column.Value + " "
));
File.WriteAllText(filePath, Regex.Replace(File.ReadAllText(filePath),
    "(''['"" + column.Key + "'"''])",
    "['"" + column.Value + "'"]"
));

然而,每次替换都打开和关闭文件,并且似乎偶尔它们运行得"太快",并且一次替换将无法工作,因为文件在之前的字符串替换中尚未关闭。是否有任何代码我可以重用来解决这个问题,也许使用FileStream类(所以我可以打开和关闭一次)?或者对更好的方法有什么建议?只是想知道是否有一些更简单的事情我可以做,而不是必须创建我想要替换的字符串的字节数组,并编写代码来手动读取,写入和查找字节。谢谢。

如何在同一文件中优雅地实现多个字符串替换?

更好的做法是读取一次文件的内容,并将其存储到一个局部变量中。然后执行所需的任何更改(在本例中是两个正则表达式),然后将输出写入文件。文件IO是计算机可以执行的最昂贵的操作之一,而内存中的计算要便宜得多。尽可能少地撞击磁盘,只要你能避免它。

嗯,我会用:

 string text = File.ReadAllText(filePath);
 text = Regex.Replace(...);
 text = Regex.Replace(...);
 ...
 File.WriteAllText(filePath, text);

听到原来的代码不能工作,我仍然感到惊讶。就多次写入和读取而言,这不是令人愉快的,但我希望它能工作。

string contents = File.ReadAllText(filePath);
contents = Regex.Replace(contents,
    "( " + column.Key + " )",
    " " + column.Value + " ");
contents = Regex.Replace(contents,
    "(''['"" + column.Key + "'"''])",
    "['"" + column.Value + "'"]");
File.WriteAllText(filePath, contents);

听起来你应该做你所有的字符串替换驻留在内存中的字符串,然后把你的最终结果字符串写入磁盘

var fileContents = File.ReadAllText(filePath);
fileContents = Regex.Replace(fileContents,
    "( " + column.Key + " )",
    " " + column.Value + " "
);
fileContents = Regex.Replace(fileContents ,
    "(''['"" + column.Key + "'"''])",
    "['"" + column.Value + "'"]"
);
File.WriteAllText(filePath, fileContents);

嗯,最简单的方法是ReadAllText,做你的替换,然后WriteAllText

var text = File.ReadAllText(filePath);
text = Regex.Replace(text,"( " + column.Key + " )"," " + column.Value + " ");
text = Regex.Replace(text,"(''['"" + column.Key + "'"''])","['"" + column.Value + "'"]");
File.WriteAllText(text,filePath);