Как удалить первые «X» строки текстового файла? - PullRequest
4 голосов
/ 04 октября 2009

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

Я думаю о том, чтобы сделать что-то подобное, которое я собрал из других уроков и примеров, которые я прочитал:

String line = null;

String tempFile = Path.GetTempFileName();
String filePath = openFileDialog.FileName;

int line_number = 0;
int lines_to_delete = 25;

using (StreamReader reader = new StreamReader(originalFile)) {
    using (StreamWriter writer = new StreamWriter(tempFile)) {
        while ((line = reader.ReadLine()) != null) {
            line_number++;

            if (line_number <= lines_to_delete)
                continue;

            writer.WriteLine(line);
        }
    }
}

if (File.Exists(tempFile)) {
    File.Delete(originalFile);
    File.Move(tempFile, originalFile);
}

Но я не знаю, сработает ли это из-за небольших вещей, таких как номера строк, начинающиеся со строки 0 или еще чего-нибудь ... также я не знаю, хороший ли это код с точки зрения эффективности и формы. *

Спасибо большое.

Ответы [ 4 ]

8 голосов
/ 04 октября 2009

Мне нравится это коротко ...

File.WriteAllLines(
    fileName,
    File.ReadAllLines(fileName).Skip(numberLinesToSkip).ToArray());
6 голосов
/ 04 октября 2009

Все нормально, и, похоже, у вас не будет проблем, которых вы боитесь. Однако более узкий подход был бы обеспечен двумя отдельными циклами - один для подсчета первых X строк из входного файла (и больше ничего не делать), отдельный для простого копирования других строк из ввода в вывод. То есть вместо вашей единственной петли while, есть ...:

    while ((line = reader.ReadLine()) != null) {
        line_number++;

        if (line_number > lines_to_delete)
            break;
    }

    while ((line = reader.ReadLine()) != null) {
        writer.WriteLine(line);
    }
2 голосов
/ 04 октября 2009

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

Немного менее многословная версия того, что у вас уже есть:

using (StreamReader reader = new StreamReader(originalFile))
using (StreamWriter writer = new StreamWriter(tempFile))
{
    while(lines_to_delete-- > 0)
        reader.ReadLine();
    while ((line = reader.ReadLine()) != null)
        writer.WriteLine(line);
}
0 голосов
/ 04 октября 2009

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

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

Пример:

string[] lines = System.IO.File.ReadAllLines("YourFile.txt").Skip(10).ToArray();
System.IO.File.WriteAllLines("OutFile.txt", lines);
...