Текстовый файл с каждой строкой представляет пользователя, могу ли я обновить конкретную строку? - PullRequest
1 голос
/ 14 мая 2010

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

123, joe blow, USA

Где первые значения представляют:

USERID, ИМЯ, СТРАНА

Если в моем файле 5000 строк, могу ли я каким-то образом обновить конкретную строку, используя C #?

Ответы [ 3 ]

4 голосов
/ 14 мая 2010

Хотя можно изменить строку в файле - , вы можете сделать это безопасно только в том случае, если замещающий текст будет точно такой же длины . Так как это редко бывает, ваш Лучше всего заменить все содержимое файла новыми результатами.

Строковые текстовые файлы не являются отличным форматом для хранения информации, которая может измениться именно по этой причине.

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

using System.IO;

var linesOfText File.ReadLines( "/myfile.txt", Text.Encoding.UTF8 ).ToArray();

linesOfText[123] = "456, sally smith, USA";

File.WriteAllLines( "/myfile.txt", linesOfText );

РЕДАКТИРОВАТЬ: В целях краткости я привел приведенный выше пример, который использует индексированную позицию для обновления конкретной строки. При любом реальном использовании вы должны анализировать строки и искать ту, которую хотите обновить / заменить, а не полагаться на смещение.

Я бы не использовал приведенный выше код, если файл слишком большой, ~ 5000 строк по 50 символов относительно мал (<1Mb), так что я бы не волновался. Но если вы собираетесь выполнять этот тип операции снова и снова, вы можете переосмыслить способ хранения этих данных. </p>

2 голосов
/ 14 мая 2010

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

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

1 голос
/ 14 мая 2010

У вас есть два варианта.

  1. Используйте Stream, найдите индекс вашей строки и вставьте несколько символов
  2. Загрузить весь файл в массив, изменить его и переписать весь файл.

При выборе опции 1 ваш код будет более сложным, но он будет масштабироваться для работы, даже если ваш файл увеличится до 500 000 000 строк.

При использовании опции 2 код очень прост, но поскольку вы загружаете все это в память, он не очень эффективен для больших наборов данных.

Для варианта 2 код, подобный этому, может помочь вам начать:

var sbld = new System.Text.StringBuilder(); 
var rows = System.IO.File.ReadAllLines(@"C:\YourUserTextFile.txt");
foreach(var row in rows)
{
    if(!updateThisRow(row)) 
    {
        var ar = row.Split(',');
        var id = ar[0];
        var name = ar[1];
        var country = ar[2];
        // do update here
        sbld.AppendLine(String.Format("{0},{1},{2}", id, name, country));
    }
    else
    {
        sbld.AppendLine(row);
    }
}

System.IO.File.WriteAllText(C:\YourUserTextFile.txt", sbld.ToString());

Метод updateThisRow может быть чем-то, что вы пишете, чтобы увидеть строку, которую вы хотите обновить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...