Быстрая замена первой строки большого файла
У меня есть много больших файлов 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 без повторения любой другой строки этих огромных файлов?
Ответы
Ответ 1
Если вы можете гарантировать, что fixedLine
имеет одинаковую длину (или меньше) в качестве line
, вы можете обновлять файлы на месте вместо их копирования.
Если нет, вы можете получить небольшое улучшение производительности, обратившись к .BaseStream
ваших StreamReader
и StreamWriter
и сделав большие блокированные копии (используя, скажем, 32-байтовый буфер), чтобы сделать копирование, которое по крайней мере, устранит время, затрачиваемое на проверку каждого персонажа, чтобы увидеть, является ли он символом конца строки, как сейчас, с reader.ReadLine()
.
Ответ 2
Единственное, что может значительно ускорить его, - это то, что вы действительно можете заменить первую строку. Если новая первая строка уже не старая, замените ее (при необходимости пробелом) на первую строчку.
В противном случае вам нужно создать новый файл и скопировать остальные после первой строки. Возможно, вы сможете оптимизировать копирование бит, отрегулировав размер буфера/явную копию как размер двоичного/распределяемого, но это не изменит того факта, что вам нужно скопировать весь файл.
Еще один чит, если вы планируете в любом случае удалить данные CSV в БД: если порядок не имеет значения, вы можете прочитать некоторые строки с самого начала, заменить их новым заголовком и добавить удаленные строки в конец файла.
Боковое примечание: если это разовая операция, я бы просто копировал файлы и делал с ними... Отладка кода, который вставляет данные в середину текстового файла с потенциально различной кодировкой, может не стоить усилий.