如何查找和替换文件中的文本

目前为止是我的代码

StreamReader reading = File.OpenText("test.txt");
string str;
while ((str = reading.ReadLine())!=null)
{
if (str.Contains("some text"))
{
StreamWriter write = new StreamWriter("test.txt");
}
}

我知道如何找到文本,但我不知道如何替换文件中的文本与我自己的。

370800 次浏览

你将很难写到同一个文件,你正在读取。一个快速的方法就是这样做:

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

读取所有文件内容。用 String.Replace替换。将内容写回文件。

string text = File.ReadAllText("test.txt");
text = text.Replace("some text", "new value");
File.WriteAllText("test.txt", text);

你很可能需要把文本文件放到内存中,然后进行替身计画处理。然后,您必须使用您清楚了解的方法覆盖该文件。所以你会首先:

// Read lines from source file.
string[] arr = File.ReadAllLines(file);

然后可以循环访问并替换数组中的文本。

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

这个方法使您能够对可以执行的操作进行一些控制。或者,只需在一行中进行替换

File.WriteAllText("test.txt", text.Replace("match", "new value"));

希望这个能帮上忙。

您需要将读入的所有行都写入到输出文件中,即使您不更改它们。

比如:

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

如果您想在适当的位置执行这个操作,那么最简单的方法是使用一个临时输出文件,并在最后用输出替换输入文件。

File.Delete("input.txt");
File.Move("output.txt", "input.txt");

(尝试在文本文件的中间执行更新操作相当困难,因为由于大多数编码的宽度是可变的,所以总是让替换的长度相同是很困难的。)

编辑: 与其使用两个文件操作来替换原始文件,不如使用 File.Replace("input.txt", "output.txt", null)。(参见 < a href = “ https://Learn.microsoft.com/en-us/dotnet/api/system.io.file.change? redirectedfrom = MSDN & amp; view = net-6.0 # overload”rel = “ nofollow noReferrer”> MS 文件

这就是我如何使用一个大(50GB)文件:

我尝试了两种不同的方法: 第一种,将文件读入内存并使用正则表达式替换或字符串替换。然后我将整个字符串附加到一个临时文件。

第一种方法适用于一些正则表达式替换,但是适用于正则表达式。替换或字符串。如果在一个大文件中进行多次替换,替换可能会导致内存不足错误。

第二种方法是逐行读取临时文件,并使用 StringBuilder 手动构建每一行,并将每一行处理后的内容附加到结果文件。这个方法很快。

static void ProcessLargeFile()
{
if (File.Exists(outFileName)) File.Delete(outFileName);


string text = File.ReadAllText(inputFileName, Encoding.UTF8);


// EX 1 This opens entire file in memory and uses Replace and Regex Replace --> might cause out of memory error


text = text.Replace("</text>", "");


text = Regex.Replace(text, @"\<ref.*?\</ref\>", "");


File.WriteAllText(outFileName, text);








// EX 2 This reads file line by line


if (File.Exists(outFileName)) File.Delete(outFileName);


using (var sw = new StreamWriter(outFileName))
using (var fs = File.OpenRead(inFileName))
using (var sr = new StreamReader(fs, Encoding.UTF8)) //use UTF8 encoding or whatever encoding your file uses
{
string line, newLine;


while ((line = sr.ReadLine()) != null)
{
//note: call your own replace function or use String.Replace here
newLine = Util.ReplaceDoubleBrackets(line);


sw.WriteLine(newLine);
}
}
}


public static string ReplaceDoubleBrackets(string str)
{
//note: this replaces the first occurrence of a word delimited by [[ ]]


//replace [[ with your own delimiter
if (str.IndexOf("[[") < 0)
return str;


StringBuilder sb = new StringBuilder();


//this part gets the string to replace, put this in a loop if more than one occurrence  per line.
int posStart = str.IndexOf("[[");
int posEnd = str.IndexOf("]]");
int length = posEnd - posStart;




// ... code to replace with newstr




sb.Append(newstr);


return sb.ToString();
}

这个密码对我很管用

- //-------------------------------------------------------------------
// Create an instance of the Printer
IPrinter printer = new Printer();


//----------------------------------------------------------------------------
String path = @"" + file_browse_path.Text;
//  using (StreamReader sr = File.OpenText(path))


using (StreamReader sr = new System.IO.StreamReader(path))
{


string fileLocMove="";
string newpath = Path.GetDirectoryName(path);
fileLocMove = newpath + "\\" + "new.prn";






string text = File.ReadAllText(path);
text= text.Replace("<REF>", reference_code.Text);
text=   text.Replace("<ORANGE>", orange_name.Text);
text=   text.Replace("<SIZE>", size_name.Text);
text=   text.Replace("<INVOICE>", invoiceName.Text);
text=   text.Replace("<BINQTY>", binQty.Text);
text = text.Replace("<DATED>", dateName.Text);


File.WriteAllText(fileLocMove, text);






// Print the file
printer.PrintRawFile("Godex G500", fileLocMove, "n");
// File.WriteAllText("C:\\Users\\Gunjan\\Desktop\\new.prn", s);
}

我倾向于尽可能多地使用简单的转发代码,下面的代码对我很有用

using System;
using System.IO;
using System.Text.RegularExpressions;


/// <summary>
/// Replaces text in a file.
/// </summary>
/// <param name="filePath">Path of the text file.</param>
/// <param name="searchText">Text to search for.</param>
/// <param name="replaceText">Text to replace the search text.</param>
static public void ReplaceInFile( string filePath, string searchText, string replaceText )
{
StreamReader reader = new StreamReader( filePath );
string content = reader.ReadToEnd();
reader.Close();


content = Regex.Replace( content, searchText, replaceText );


StreamWriter writer = new StreamWriter( filePath );
writer.Write( content );
writer.Close();
}