我有许多大型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行的更快捷的方法是什么?
答案 0 :(得分:7)
如果您可以保证fixedLine
的长度(或更短)与line
相同,则可以就地更新文件而不是复制它们。
如果没有,您可以通过访问.BaseStream
和StreamReader
的{{1}}并执行大块副本(例如,使用32K字节缓冲区)来提高性能进行复制,这至少可以消除检查每个角色所花费的时间,看看它是否是StreamWriter
现在发生的行尾字符。
答案 1 :(得分:6)
唯一可以显着加快速度的是你真的可以替换第一行。如果新的第一行不再是旧的第一行 - 请小心地替换(如果需要,使用空格填充)第一行。
否则 - 您必须创建新文件并在第一行后复制其余文件。您可以通过将缓冲区大小/显式副本调整为二进制/每分配大小来优化一点复制,但它不会改变您需要复制整个文件的事实。
如果您计划将CSV数据放入数据库,还有一个作弊:如果顺序无关紧要,您可以从头开始读取一些行,用新标题替换它们,并将删除的行添加到文件末尾。
旁注:如果这是一次性操作,我只需复制文件并完成它...调试代码将数据插入到具有可能不同编码的文本文件中间可能不值得付出努力。