2012-12-06 6 views
12

大きなファイルの最初の行を置き換えます。各ファイルについて、最初の行を置換する必要がありますので、ヘッダーを列名にフォーマットできます。私の現在のソリューションは、次のとおりです。はすぐに私は、データベースにインポートしています多くの大規模なCSVファイル(1〜10ギガバイトごとに)持っている

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

私はたぶんコマンドラインからこれをやっています。 'copy headerfile + csvfile newfile'変更が必要なすべてのファイルをバッチファイルにすることができます。 (ああ、あらかじめヘッダーが何か分からないように見えますが、そうでない場合は助けになりません) –

+0

使用しているツールがファイルの代わりに 'stdin'を使って入力するとヘッダーとボディで構成されるストリームを作成し、必要に応じてインポートツールにそのストリームを供給することができます。例えば'cat headerfile bigfile | import_tool' –

+0

これはfixedLineの長さと最初の行に非常に敏感です。 fixedLineはもっと大きくなることがありますか? line2はファイルの最後に移動できますか? –

答えて

7

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

ない場合は、おそらくあなたStreamReaderStreamWriter.BaseStreamにアクセスし、少なくとも排除するのコピーを行うには(たとえば、32Kバイトのバッファを使用して)大きなブロックのコピーを、実行して少し性能向上を得ることができますすべての文字をチェックして、行末の文字であるかどうかを今度はreader.ReadLine()で確認するのに費やした時間。

+0

もしそれが少なければ、あなたは "フリー"スペースで何をしますか?スペースで埋めてください。 – Jodrell

+0

おそらく、フォーマットに依存します。 CSVファイルでは、ヘッダ要素を引用し、コンマの後にパディングスペースを追加することができます。 – prprcupofcoffee

+1

+1。 @ジョドレル、はい、ほとんどの場合、スペースはCSVのため無視されます - パディングのためにそれらを使用することはOKです(私は私の同じ答え:)でそれを示そうとしました:))。ほとんどのエンコーディングではスペースも安全です。したがって、必要に応じてバイトとしてストリームに直接書き込むことができます。 –

6

大幅にスピードアップできる唯一のことは、実際にファーストラインを置き換えることができる場合です。新しい最初の行が古い行よりも古い場合は、最初の行を注意深く置き換えます(必要に応じてスペースを埋めます)。

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

CSVデータをDBにドロップしようとするともう一度やり直してください。順序が問題でない場合は、最初からいくつかの行を読み込み、新しいヘッダーに置き換えて、ファイルの最後に削除した行を追加してください。

サイドノート:これは1回の操作であれば、私は単純にファイルをコピーしたいし、それを行うことが...努力かもしれない価値がない潜在的に異なるエンコーディングでテキストファイルの真ん中にデータを挿入するコードをデバッグします。

関連する問題