12

データベースにインポートしている大きな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行目のみを置き換えるより迅速な方法は何ですか?

4

2 に答える 2

7

fixedLineが と同じ長さ (またはそれ以下) であることを保証できる場合はline、ファイルをコピーする代わりにその場で更新できます。

そうでない場合は、にアクセスし、大きなブロック コピー (たとえば、32K バイトのバッファーを使用) を実行してコピーを行うことで、パフォーマンスを少し改善できる可能性があり.BaseStreamます。で現在発生しているように、それが行末文字である場合。StreamReaderStreamWriterreader.ReadLine()

于 2012-12-06T16:49:14.063 に答える
6

大幅に高速化できる唯一のことは、最初の行を実際に置き換えることができる場合です。新しい最初の行が古いものよりも長くない場合 - 最初の行を慎重に置き換えます (必要に応じてスペースをパディングします)。

それ以外の場合 - 新しいファイルを作成し、最初の行の後に残りをコピーする必要があります。バッファーサイズ/明示的なコピーをバイナリ/割り当てサイズとして調整することで、コピーを少し最適化できる場合がありますが、ファイル全体をコピーする必要があるという事実は変わりません。

とにかくCSVデータをDBにドロップすることを計画している場合のもう1つのチート:順序が重要でない場合は、最初からいくつかの行を読み取り、それらを新しいヘッダーに置き換えて、削除された行をファイルの最後に追加します.

補足: これが 1 回限りの操作である場合は、ファイルをコピーするだけで完了です... 潜在的に異なるエンコーディングでテキスト ファイルの途中にデータを挿入するコードをデバッグすることは、努力する価値がないかもしれません。

于 2012-12-06T16:48:23.367 に答える