问题描述
|
我正在寻找一种方法,以逗号分隔的txt文件搜索关键字,然后在该行上替换另一个关键字。例如,如果我在大txt文件中包含以下行:
Help,0
我想在txt中找到此行(通过告诉程序寻找第一个单词“'help \'),并将0替换为1表示我已经阅读过一次,因此它看起来像:
Help,1
谢谢
解决方法
尝试覆盖同一文件中的数据通常是一个非常糟糕的主意:如果您的代码引发异常,您将得到部分处理的文件;如果搜索目标和替换值的长度不同,则必须重写文件的其余部分。请注意,这些方法不适用于您的特定情况-但最好不要让它成为习惯。
我的建议:
打开输入文件和临时文件(
Path.GetTempFileName
)
处理并写入每一行(StreamReader.ReadLine
)
完成后,没有错误,将原始文件重命名为origFile.old
将临时文件重命名为原始文件名。
如果出现问题,请删除临时文件并退出。这样,如果发生错误,原始文件将保持不变。
, 如果要替换“就地”(这意味着您不想使用另一个临时文件),则可以使用FileStream。
您有两种选择,可以在文件流中按Read
,直到找到所需的文本,然后发出Write
。请记住,“ 6”在字节级别起作用,因此您需要考虑字符编码。 Encoding.GetString
将进行转换。
或者,您可以搜索文本并记下其位置。然后,您可以打开FileStream并在该位置仅Seek
。然后您可以发行Write
。
这可能是最有效的方法,但比幼稚的选择肯定更具挑战性。通过天真的实现,您:
将整个文件读入内存(File.ReadAllText
)
执行替换(Regex.Replace
)
将其写回磁盘(File.WriteAllText
)
没有第二个文件,但是您受系统拥有的内存量的束缚。如果您知道您一直在处理小文件,则可以选择这种方法。否则,您需要阅读字符编码和文件流。
这是关于该主题的另一个SO问题(包括示例代码):通过C#在适当位置编辑文本文件