С# Читать текстовый файл построчно и редактировать определенную строку

Я хочу прочитать текстовый файл построчно и отредактировать определенную строку. Итак, я поместил текстовый файл в строковую переменную, например:

string textFile = File.ReadAllText(filename);

Мой текстовый файл выглядит так:

Line A
Line B
Line C
Line abc
Line 1
Line 2
Line 3

У меня есть определенная строка (="abc"), которую я хочу найти в этом текстовом файле. Итак, я читаю строки, пока не найду строку и перехожу к третьей строке («Строка 3» -> эта строка всегда отличается) после этой найденной строки:

string line = "";
string stringToSearch = "abc";

using (StringReader reader = new StringReader(textFile))
{
    while ((line = reader.ReadLine()) != null)
    {
        if (line.Contains(stringToSearch))
        {
            line = reader.ReadLine();
            line = reader.ReadLine();
            line = reader.ReadLine();

            //line should be cleared and put another string to this line.
        }
    }
}

Я хочу очистить третью строку чтения и поместить в эту строку другую строку и сохранить все string в textFile.

Как я могу это сделать?


person Giovanni19    schedule 30.08.2017    source источник
comment
Это может помочь: Файл .ReadAllLines. Используйте это, переберите все строки, замените ту, которую хотите заменить, а затем просто верните исходный файл.   -  person Tamás Szabó    schedule 30.08.2017


Ответы (4)


Вы можете сохранить содержимое в StringBuilder следующим образом:

StringBuilder sbText = new StringBuilder();
using (var reader = new System.IO.StreamReader(textFile)) {
    while ((line = reader.ReadLine()) != null) {
        if (line.Contains(stringToSearch)) {
            //possibly better to do this in a loop
            sbText.AppendLine(reader.ReadLine());
            sbText.AppendLine(reader.ReadLine());

            sbText.AppendLine("Your Text");
            break;//I'm not really sure if you want to break out of the loop here...
        }else {
            sbText.AppendLine(line);
        }
    }
}  

а затем напишите это так:

using(var writer = new System.IO.StreamWriter(@"link\to\your\file.txt")) {
    writer.Write(sbText.ToString());
}

Или, если вы просто хотите сохранить его в строке textFile, вы можете сделать это так:

textFile = sbText.ToString();
person waka    schedule 30.08.2017
comment
Большое спасибо! Кажется, это правильный подход. Теперь у меня есть только проблема с ошибкой при записи строки обратно в строку textFile. Недопустимый символ в пути для следующей строки: using(var writer = new System.IO.StreamWriter(textFile)) { - person Giovanni19; 30.08.2017
comment
@ Giovanni19: Моя ошибка, textFile должен быть ссылкой на ваш текстовый файл, в который вы хотите написать. Я вижу, что вы использовали переменную по-другому в своем посте. Если вы просто хотите сохранить его как строку в textFile, вы можете использовать: textFile = sbText.ToString(). Я обновил ответ. - person waka; 30.08.2017
comment
Спасибо. Но это добавляет новую строку к строке, которая имеет, например. строка абв. Я хочу добавить новую строку в третью строку после строки abc. - person Giovanni19; 30.08.2017
comment
@Giovanni19: я обновил ответ. Теперь он должен работать так, как вы хотели, чтобы он работал. ;) - person waka; 30.08.2017

Вы, вероятно, захотите что-то вроде следующего:

DirectoryInfo di = new DirectoryInfo(Location);
FileInfo[] rgFiles = di.GetFiles("txt File");

foreach (FileInfo fi in rgFiles)
{
    string[] alllines = File.ReadAllLines(fi.FullName);

    for (int i = 0; i < alllines.Length; i++)
    {
        if (alllines[i].Contains(stringToSearch))
        {                        
            alllines[i] = alllines[i].Replace(stringToSearch, some value );
        }
    }
}

Таким образом, вы будете читать текстовый файл построчно до конца документа, и если значение будет выбрано, оно будет заменено вашим новым значением.

person Community    schedule 30.08.2017
comment
Это не то, чего я хочу :/ См. мой первый пост. - person Giovanni19; 30.08.2017
comment
@ Giovanni19, вы хотите прочитать документ построчно и обновить значение (если оно найдено), затем вы хотите обновить это значение? Я не ошибаюсь? Этот приведенный выше код будет работать для этого... вы хотите сохранить новую версию этого документа? - person ; 31.08.2017

Написать весь файл заново было бы проще:

string old  = "abc";
string nw   = "aa";
int counter = 0;

using(StreamWriter w = new StreamWriter("newfile")
{
    foreach(string s in File.ReadLines(path))
        w.WriteLine(s == old ? nw : s);
}
person Feras Al Sous    schedule 30.08.2017
comment
Теперь строка abc заменяется, а это не то, чего хотел ОП. Также new является ключевым словом и не может использоваться в качестве имени переменной. - person waka; 30.08.2017
comment
Кроме того, using должен быть в нижнем регистре, должен иметь фигурные скобки, и вы не можете использовать if (foo = value), потому что это не будет оцениваться как логическое (а в некоторых языках, таких как C++, значение foo изменится и возникнут странные ошибки). Вместо этого вы должны использовать if (foo == value). Кроме того, nw — ужасное имя переменной. Почему не newValue или что-то описательное? - person AustinWBryan; 19.07.2018

Вот полный пример:

using System;
using System.IO;

namespace rename
{
    class Program
    {
        static void Main(string[] args)
        {
            // Fix files, replace text
            DirectoryInfo di = new DirectoryInfo(@"C:\temp\all\");
            FileInfo[] rgFiles = di.GetFiles("*");

            foreach (FileInfo fi in rgFiles)
            {
                string[] alllines = File.ReadAllLines(fi.FullName);

                for (int i = 0; i < alllines.Length; i++)
                {
                    if (alllines[i].StartsWith("00:"))
                    {
                        // Edit: Replace these lines with an empty line
                        alllines[i] = alllines[i].Replace(alllines[i], "");
                    }
                }

                // Rewrite new files in the folder
                File.WriteAllLines(@"C:\temp\new\" + fi.Name, alllines);
            }
        }
    }
}
person live-love    schedule 27.12.2020