如何查找和replaceC#文件中的文本
我的代码到目前为止
StreamReader reading = File.OpenText("test.txt"); string str; while ((str = reading.ReadLine())!=null) { if (str.Contains("some text")) { StreamWriter write = new StreamWriter("test.txt"); } }
我知道如何find文本,但我不知道如何用自己的文件replace文件中的文本。
阅读所有文件内容。 用String.Replace
进行replace。 将内容写回文件。
string text = File.ReadAllText("test.txt"); text = text.Replace("some text", "new value"); File.WriteAllText("test.txt", text);
你将很难写入你正在阅读的同一个文件。 一个简单的方法是简单地做到这一点:
File.WriteAllText("test.txt", File.ReadAllText("test.txt").Replace("some text","some other text"));
你可以更好地解决这个问题
string str = File.ReadAllText("test.txt"); str = str.Replace("some text","some other text"); File.WriteAllText("test.txt", str);
您需要将所有读取的行写入输出文件,即使您不更改它们。
就像是:
using (var input = File.OpenText("input.txt")) using (var output = new StreamWriter("output.txt")) { string line; while (null != (line = input.ReadLine())) { // optionally modify line. output.WriteLine(line); } }
如果你想执行这个操作,那么最简单的方法是使用一个临时输出文件,最后用输出replaceinput文件。
File.Delete("input.txt"); File.Move("output.txt", "input.txt");
(试图在文本文件的中间执行更新操作是很难得到正确的,因为总是具有相同长度的replace是困难的,因为大多数编码是可变的宽度。)
编辑:而不是两个文件操作来replace原始文件,最好使用File.Replace("input.txt", "output.txt", null)
。 (请参阅MSDN 。)
很可能你将不得不将文本文件拖入内存,然后进行replace。 然后您将不得不使用您清楚知道的方法覆盖文件。 所以你会首先:
// Read lines from source file. string[] arr = File.ReadAllLines(file);
YOu然后可以遍历并replace数组中的文本。
var writer = new StreamWriter(GetFileName(baseFolder, prefix, num)); for (int i = 0; i < arr.Length; i++) { string line = arr[i]; line.Replace("match", "new value"); writer.WriteLine(line); }
这个方法给你一些控制你可以做的操作。 或者,你可以只做一行replace
File.WriteAllText("test.txt", text.Replace("match", "new value"));
我希望这有帮助。
我通过使用2种不同的方式完成了这一操作,第一种:将文件读入内存,并使用“正则expression式replace”或“stringreplace”。 然后我将整个string追加到一个临时文件。
第二个是通过逐行读取临时文件,并使用StringBuilder手动构build每行,并将每个处理后的行附加到结果文件中。
第一种方法适用于普通的正则expression式replace,但是如果你尝试在大文件中做Regex.Matches,它会占用内存。
static void ProcessLargeFile() { if (File.Exists(outputDefsFileName)) File.Delete(outputDefsFileName); if (File.Exists(defTempProc1FileName)) File.Delete(defTempProc1FileName); if (File.Exists(defTempProc2FileName)) File.Delete(defTempProc2FileName); string text = File.ReadAllText(inputDefsFileName, Encoding.UTF8); // PROC 1 This opens entire file in memory and uses Replace and Regex Replace text = text.Replace("</text>", ""); text = Regex.Replace(text, @"\<ref.*?\</ref\>", ""); File.WriteAllText(defTempProc1FileName, text); // PROC 2 This reads file line by line and uses String.IndexOf and String.Substring and StringBuilder to build the new lines using (var fileStream = File.OpenRead(defTempProc1FileName)) using (var streamReader = new StreamReader(fileStream, Encoding.UTF8)) { string line, newdef; while ((line = streamReader.ReadLine()) != null) { String[] arr = line.Split('\t'); string def = arr[2]; newdef = Util.ProcessDoubleBrackets(def); File.AppendAllText(defTempProc2FileName, newdef + Environment.NewLine); } } } public static string ProcessDoubleBrackets(string def) { if (def.IndexOf("[[") < 0) return def; StringBuilder sb = new StringBuilder(); ... Some processing sb.Append(def.Substring(pos, i - pos)); ... Some processing return sb.ToString(); }