快速替换第一行大文件

我有许多大型csv文件(每个1-10 GB),我将其导入数据库。 对于每个文件,我需要替换第一行,以便我可以将标题格式化为列名。 我目前的解决方案是:

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行而不迭代这些巨大文件的每一行?

如果可以保证fixedLine与行的长度(或更小)相同,则可以就地更新文件而不是复制它们。

如果没有,您可以通过访问StreamReaderStreamWriter.BaseStream并执行大块复制(使用32K字节缓冲区)来进行复制,从而获得性能提升,这至少可以消除检查所花费的时间。每个角色,看看它是否是现在使用reader.ReadLine()发生的行尾字符。

唯一可以显着加快速度的是你真的可以替换第一线。 如果新的第一行不再是旧行 – 请小心地替换(如果需要,使用空格填充)第一行。

否则 – 您必须创建新文件并在第一行后复制其余文件。 您可以通过将缓冲区大小/显式副本调整为二进制/每分配大小来优化一点复制,但它不会改变您需要复制整个文件的事实。

如果你计划将CSV数据丢弃到DB中,还有一个作弊:如果顺序无关紧要,你可以从头开始读取一些行,用新标题替换它们,并将删除的行添加到文件的末尾。

旁注:如果这是一次性操作,我只需复制文件并完成它…调试代码将数据插入到具有可能不同编码的文本文件的中间可能不值得努力。