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