Как найти и заменить текст в файле на 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");
      }
}

Я знаю, как найти текст, но я понятия не имею, как заменить текст в файле своим собственным.

5 ответов


читать все содержимое файла. Сделайте замену с 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");

(попытка выполнить операции обновления в середине текстового файла довольно трудно получить право, потому что всегда иметь замену одинаковой длины hard, Котор дали большинств кодировки переменная ширина.)

EDIT: вместо двух файловых операций для замены исходного файла лучше использовать 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"));

надеюсь, это поможет.


вот как я это сделал с файлом с несколькими ГБ: я использовал 2 разных способа, первый: чтение файла в память и использование Regex Replace или String Replace. Затем я добавляю всю строку во временный файл.

второй-чтение временного файла строка за строкой и ручное построение каждой строки с помощью StringBuilder и добавление каждой обработанной строки в результирующий файл.

первый метод хорошо работает для общих замен регулярных выражений, но он свиней памяти, если вы попытаетесь делайте регулярное выражение.Совпадения в большом файле.

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

//note: don't use File.AppendAllText, it opens the file every time. Instead open StreamWriter in the beginning and write to it.
                   // 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();
        }