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


157

지금까지 내 코드

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

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


당신은 Visual Studio를 가지고 있다면,이 용액에 폴더를 포함 할 수 있고 검색을 사용하고 행운의 비주얼 스튜디오 .Best의 기능을 대체 : 만 팁 등이 의견을 고려
StackOrder

가능한 복제 파일
RecklessSergio

답변:


321

모든 파일 내용을 읽습니다. 으로 교체하십시오 String.Replace. 내용을 파일에 다시 씁니다.

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

5
보다 복잡한 교체를 위해 @WinCoder BTWRegex.Replace
Sergey Berezovskiy

35
이것은 전체 파일을 한 번에 메모리로 읽습니다.
밴시

6
@ Banshee Touche '방금 9,000,000 행을 읽으려고했지만 System out of memory예외 가 발생했습니다 .
Squ1rr3lz

4
큰 파일의 경우 더 복잡한 문제입니다. 바이트 청크 읽기, 분석, 다른 청크 읽기 등
Alexander

6
@Alexander 맞아. 한 덩어리는 "... som"로 끝나고 다른 덩어리는 "e text ..."로 시작합니다. 훨씬 더 복잡한 문제입니다.
djv 2016 년

36

읽고있는 것과 동일한 파일에 쓰는 데 어려움을 겪을 것입니다. 한 가지 빠른 방법은 간단히 이렇게하는 것입니다.

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

3
이것은 간단하지만 매우 큰 파일에는 바람직하지 않습니다. (ps 나는 downvoted 한 사람이 아닙니다)
Alvin Wong

3
동의하지만 파일을 읽는 동안 파일에 쓸 수 없습니다. 다른 파일에 쓰지 않는 한, 나중에 파일 이름을 바꾸십시오. 어떤 방식 으로든 새 파일은 메모리 나 디스크에 관계없이 빌드하는 동안 다른 곳에 저장해야합니다.
Flynn1179

@ Flynn1179이 예에서는 사실이 아닙니다. 효과가있다. 사용해보십시오. ReadAllText이전에 파일 액세스를 종료 한 것 같습니다 WriteAllText. 나는이 기술을 내 자신의 응용 프로그램에서 사용합니다.
SteveCinq

알아; 이 예제는 읽는 동안 쓰지 않습니다. 제 요점입니다!
Flynn1179

27

변경하지 않더라도 출력 파일에 읽은 모든 행을 작성해야합니다.

다음과 같은 것 :

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 참조 )


1
VB는 2 줄을 변경해야했습니다 : 입력을 새로운 StreamReader (filename)로 사용하는 동안 input.Peek ()> = 0
Brent

8

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

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

이게 도움이 되길 바란다.


6

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

두 가지 방법으로 시도했습니다. 첫 번째는 파일을 메모리로 읽고 Regex Replace 또는 String Replace를 사용하는 것입니다. 그런 다음 전체 문자열을 임시 파일에 추가했습니다.

첫 번째 방법은 몇 가지 정규식 대체에 적합하지만 Regex.Replace 또는 String.Replace는 큰 파일에서 대체를 많이 수행하면 메모리 부족 오류가 발생할 수 있습니다.

두 번째는 임시 파일을 한 줄씩 읽고 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();
    }

0

이 코드는 나를 위해 일했다

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

0

나는 가능한 간단한 코드를 사용하는 경향이있다.

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();
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.