如何查找和替换文本文件中的用C#(How to Find And Replace Text In A

2019-06-21 06:19发布

到目前为止我的代码

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

我知道如何查找的文字,但我对如何用自己的替换文件中的文本不知道。

Answer 1:

阅读所有的文件内容。 做了更换String.Replace 。 内容写回文件。

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


Answer 2:

你将有一个很难写你从读取相同的文件。 一个快速的方法是简单地做到这一点:

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


Answer 3:

你需要写你读入输出文件中的行,即使你不改变它们。

就像是:

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) (请参阅MSDN )。



Answer 4:

很可能,你必须将文本文件拉入内存,然后做替换。 然后,您将有使用你清楚知道的方法来覆盖该文件。 所以,你首先:

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

我希望这有帮助。



Answer 5:

这是我的一个大(50 GB)文件,做到了:

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

第一种方法可以很好地用于几个正则表达式替换,但Regex.Replace或与string.replace可能会导致内存不足的错误,如果你在一个大的文件做很多内容替换。

第二个是通过读取由线临时文件线和手动构建使用StringBuilder的每行和每追加处理线的结果文件中。 这种方法是非常快。

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

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

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


        // PROC 2 This reads file line by line and uses String.IndexOf and String.Substring and StringBuilder to build the new lines 

        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)
            {
                newLine = Util.ReplaceDoubleBrackets(line);

               //note: don't use File.AppendAllText, it opens the file every time and could take forever to run. Instead use StreamWriter 
               sw.Write(newLine + Environment.NewLine);
            }
        }
    }

    public static string ReplaceDoubleBrackets(string str)
    {
        //replace [[ with your own delimiter
        if (str.IndexOf("[[") < 0)
            return str;

        StringBuilder sb = new StringBuilder();

        //didn't test, but this part gets the string to replace, you might want to put this in a loop if more than one string can be found per line
        int posStart = str.IndexOf("[[");
        int posEnd = str.IndexOf("]]");
        int length = posEnd - posStart;


        //... replace String and then append it to StringBuilder
        sb.Append(newstr);

        return sb.ToString();
    }


Answer 6:

此代码为我工作

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


文章来源: How to Find And Replace Text In A File With C#