Как читать и редактировать файл .txt на С#?

Например, у меня есть текстовый файл, который гласит:

12 345 45
2342 234 45 2 2 45345
234 546 34 3 45 65 765
12 23 434 34 56 76 5

Я хочу вставить запятую между всеми числами, добавить левую скобку в начало каждой строки и правую скобку в конец каждой строки. Таким образом, после редактирования это должно выглядеть так:

{12, 345, 45}
{2342, 234, 45, 2, 2, 45345}
{234, 546, 34, 3, 45, 65, 765}
{12, 23, 434, 34, 56, 76, 5}

Как мне это сделать?


person George Powell    schedule 02.09.2009    source источник


Ответы (8)


Добавлено немного LINQ для удовольствия и прибыли (место для оптимизации;)):

System.IO.File.WriteAllLines(
    "outfilename.txt",
    System.IO.File.ReadAllLines("infilename.txt").Select(line =>
        "{" +
        string.Join(", ",
            line.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries)
        ) + "}"
    ).ToArray()
);
person aanund    schedule 02.09.2009
comment
Все в одном заявлении! Непревзойденный :-D - person Tor Haugen; 04.09.2009

Что-то вроде этого: (НЕ ПРОВЕРЕНО)

string filename = @"c:\yourfilename.txt";
StringBuilder result = new StringBuilder();

            if (System.IO.File.Exists(filename))
            {
                using (StreamReader streamReader = new StreamReader(filename))
                {
                    String line;
                    while ((line = streamReader.ReadLine()) != null)
                    {
                        string newLine = String.Concat("{", line, "}", Environment.NewLine);
                        newLine = newLine.Replace(" ", ", ");
                        result.Append(newLine);
                    }
                }
            }

using (FileStream fileStream = new FileStream(filename , fileMode, fileAccess))
            {
                StreamWriter streamWriter = new StreamWriter(fileStream);
                streamWriter.Write(result);
                streamWriter.Close();
                fileStream.Close();
            }
person Mark Redman    schedule 02.09.2009

вы должны сначала поработать над логикой, а не напрямую просить людей предоставить ее вам. что касается чтения/записи файла, вот вам:

//write      
FileStream fs = new FileStream("file_name", FileMode.Create);
StreamWriter w = new StreamWriter(fs, Encoding.UTF8);
w.WriteLine("text_to_write");
w.Flush();
w.Close();
fs.Close();

//read
fs = new FileStream("file_name", FileMode.Open);
StreamReader r = new StreamReader(fs, Encoding.UTF8);
Console.WriteLine(r.ReadLine());
r.Close();
fs.Close();
person cw22    schedule 02.09.2009
comment
Вы должны использовать операторы using, чтобы гарантировать правильное удаление объектов (FileStreams, StreamReaders и StreamWriters). - person Dan McClain; 02.09.2009

Прочитайте каждую строку.

Добавьте скобки перед строкой и после

Затем замените пробел " " на ", " (запятая и пробел)

person waqasahmed    schedule 02.09.2009

Вам потребуется использовать класс FileStream для откройте файл, класс StreamReader для чтения из файла и класс StreamWriter для обратной записи в файл.

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

FileStream file = new FileStream("FileName", FileMode.Open, FileAccess.ReadWrite);

Затем оберните FileStream в StreamReader:

StreamReader reader = new StreamReader(file);

Затем прочитайте каждую строку и выполните обработку строки (добавляя запятые и скобки):

while(reader.EndOfFile)
{
   string currentLine = reader.ReadLine();
   // do your string processing here and save the result somewhere
}

Наконец, заверните FileStream в StreamWriter и запишите измененные строки обратно в файл:

StreamWriter writer = new StreamWriter(file);

// Write your content here
writer.Write("my content");

Не забывайте закрывать свои потоки после работы с ними.

reader.Close();
writer.Close();
file.Close();
person Donut    schedule 02.09.2009
comment
У меня есть вопрос. Когда я открываю тот же файл, я должен записать все данные обратно. не только отредактированные данные - person John Demetriou; 16.10.2013

изменить, чтобы добавить, как изменить sLine. (не проверял, но я уверен, что он будет работать нормально)

    StreamReader sr = new StreamReader("path/to/file.txt");
    StreamWriter sw = new StreamWriter("path/to/outfile.txt");
    string sLine = sr.ReadLine();
    for (; sLine != null; sLine = sr.ReadLine() )
    {
        sLine = "{" + sLine.Replace(" ", ", ") + "}";
        sw.WriteLine(sLine);
    }
person jb.    schedule 02.09.2009

  1. Загрузить весь файл
  2. используйте string.split('\n') чтобы разделить содержимое на строки
  3. используйте string.replace(' ',',') для вставки запятых.
  4. Сохраните файл.

Или, как сказал Вакасахмед, просто делайте это по очереди.

См. также: http://www.csharphelp.com/archives/archive24.html

Кроме того, это подозрительно похоже на домашнее задание. Может быть, у нас должен быть тег «домашнее задание»?

person 3Dave    schedule 02.09.2009

В конце концов я использовал второй файл, а не редактировал первый:

TextReader reader = new StreamReader("triangle.txt");
TextWriter writer = new StreamWriter("triangle2.txt");
for (; ; )
{
    string s = reader.ReadLine();
    if (s == null)
       break;
    s = s.Replace(" ", ", ");
    s = "{" + s + "},";
    writer.WriteLine(s);
}
person George Powell    schedule 02.09.2009
comment
Вместо бесконечного цикла for с разрывом вы должны использовать цикл while, подобный следующему: while(reader.Peek() › -1) - person Dan McClain; 02.09.2009
comment
Я бы избегал бесконечных циклов for(;;) ; кажется плохим стилем. Вы можете упростить это как while ((s=reader.Readline())!=null) { .... } - person 3Dave; 11.09.2009