Programing

C #을 사용하여 파일에서 텍스트를 찾아 바꾸는 방법

crosscheck 2020. 6. 17. 08:02
반응형

C #을 사용하여 파일에서 텍스트를 찾아 바꾸는 방법


지금까지 내 코드

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

텍스트를 찾는 방법을 알고 있지만 파일의 텍스트를 내 텍스트로 바꾸는 방법을 모릅니다.


모든 파일 내용을 읽습니다. 으로 교체하십시오 String.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);
  }
}

이 작업을 제자리에서 수행하려면 가장 쉬운 방법은 임시 출력 파일을 사용하고 마지막에 입력 파일을 출력으로 바꾸는 것입니다.

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

(텍스트 파일 중간에 업데이트 작업을 시도하는 것은 대부분의 인코딩이 가변 너비이기 때문에 항상 동일한 길이를 교체하는 것이 어려우므로 올바른 방법이 아닙니다.)

편집 : 원본 파일을 대체하는 두 가지 파일 작업 대신 사용하는 것이 좋습니다 File.Replace("input.txt", "output.txt", null). ( MSDN 참조 )


텍스트 파일을 메모리로 가져 와서 교체해야 할 수도 있습니다. 그런 다음 명확하게 알고있는 방법을 사용하여 파일을 덮어 써야합니다. 그래서 당신은 먼저 할 것입니다 :

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

이게 도움이 되길 바란다.


이것은 큰 (50GB) 파일로 어떻게했는지입니다.

I tried 2 different ways: the first, reading the file into memory and using Regex Replace or String Replace. Then I appended the entire string to a temporary file.

The first method works well for a few Regex replacements, but Regex.Replace or String.Replace could cause out of memory error if you do many replaces in a large file.

The second is by reading the temp file line by line and manually building each line using StringBuilder and appending each processed line to the result file. This method was pretty fast.

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

This code Worked for me

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

참고URL : https://stackoverflow.com/questions/13509532/how-to-find-and-replace-text-in-a-file-with-c-sharp

반응형