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

时间:2011-04-12 16:27:57

标签: c# regex string file-io filestream

目前我有一些代码可以替换文件中的字符串,如下所示:

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类(所以我可以打开和关闭一次)?或者建议更好的方法吗?只是想知道是否有更简单的事情,我必须创建比我想要替换的字符串的字节数组,并手动编写代码来读取,写入和搜索字节。感谢。

6 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

好吧,我会用:

 string text = File.ReadAllText(filePath);

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

听到原始代码无法正常工作,我仍然感到惊讶。在多次写入和读取方面,这并不令人愉快,但我希望它能够正常工作。

答案 2 :(得分:2)

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);

答案 3 :(得分:1)

听起来你应该对驻留在内存中的字符串进行所有字符串替换,然后将最终生成的字符串写入磁盘。

答案 4 :(得分:1)

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);

答案 5 :(得分:1)

嗯,最简单的方法是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);