快速更换大文件的第一行(Quickly replace first line of large fi

2019-08-03 14:54发布

我有我导入到数据库中许多大的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号线不经过这些大文件的所有其他行迭代?

Answer 1:

如果你能保证fixedLine的长度相同(或更少)的line ,你可以就地更新文件复制它们代替。

如果没有,你都不可能通过访问得到一个小的性能提升.BaseStream您的StreamReaderStreamWriter和做的大的块拷贝(使用,比如说,一个32K字节的缓冲区)做拷贝,这将至少消除所花费的时间检查看到每一个字符,如果是结束行的字符作为现在发生reader.ReadLine()



Answer 2:

可以显著加快它的唯一的事情是,如果你真的可以取代第一线。 如果新的第一线比旧的不再 - 小心(如果需要的话,空间填充)取代第一线。

否则 - 你必须创建新的文件,第一行后,其余的复制。 您可以优化调整缓存大小/复印明确作为二进制/每分配尺寸复制了一点,但它不会改变,你需要复制整个文件的事实。

还有一个骗子,如果你打算丢弃CSV数据到数据库反正:如果为了不要紧,你可以阅读从一开始就有些线路,新的报头替换它们,并添加删除的行到文件的末尾。

附注:如果这是一次性操作我会简单地复制文件,并用它做...调试将数据插入文本文件中他们有不同的编码可能不值得努力代码。



文章来源: Quickly replace first line of large file
标签: c# replace