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