Подтвердить что ты не робот

Быстрая замена первой строки большого файла

У меня есть много больших файлов csv (по 1-10 gb каждый), которые я импортирую в базы данных. Для каждого файла мне нужно заменить 1-ю строку, чтобы я мог форматировать заголовки для имен столбцов. Мое текущее решение:

using (var reader = new StreamReader(file))
{
    using (var writer = new StreamWriter(fixed))
    {
        var line = reader.ReadLine();
        var fixedLine = parseHeaders(line);
        writer.WriteLine(fixedLine);

        while ((line = reader.ReadLine()) != null)
            writer.WriteLine(line);
    }
}

Что такое быстрый способ заменить строку 1 без повторения любой другой строки этих огромных файлов?

4b9b3361

Ответ 1

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

Если нет, вы можете получить небольшое улучшение производительности, обратившись к .BaseStream ваших StreamReader и StreamWriter и сделав большие блокированные копии (используя, скажем, 32-байтовый буфер), чтобы сделать копирование, которое по крайней мере, устранит время, затрачиваемое на проверку каждого персонажа, чтобы увидеть, является ли он символом конца строки, как сейчас, с reader.ReadLine().

Ответ 2

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

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

Еще один чит, если вы планируете в любом случае удалить данные CSV в БД: если порядок не имеет значения, вы можете прочитать некоторые строки с самого начала, заменить их новым заголовком и добавить удаленные строки в конец файла.

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