Как найти и заменить текст в файле на 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");
(попытка выполнить операции обновления в середине текстового файла довольно трудно получить право, потому что всегда имея замену той же длины является трудно, учитывая, что большинство кодировок имеют переменную ширину.)
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"));
Я надеюсь, что это помогает.
вот как я сделал это с несколькими файлами GB: я использовал 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(); }