2011-07-19 12 views
1

私はクリーンアップする必要のある「悪い」タブ区切りファイルを持っています。問題は、フィールドに改行がある可能性があるという点にあります。私はこれを修正する最も簡単な方法は、間違った改行をある種の置換文字、例えばスペースで置き換えることだと思います。今そこには、ライン上のnフィールドことになっている場合、私は次のようになり、これを行う方法を想像することができます(擬似コード)不正なCSVを解析する

var line = read n-1 fields ending in a tab, and then until the end of line 
line.replace("\n", " ") 
line.replace("\r", " ") 
write line to output 

は今、これらのファイルは巨大であり、それをズルズルすることはオプションではありません。これは合理的なアプローチですか? (私はこれが最後のフィールドで改行を越えて移動することを知っていますが、私はそれと一緒に暮らしています) 十分なデータを読むにはどうすればよいでしょうか?私はどの言語に関わらず気にしませんが、利用可能なランタイムを持っているので、.net、perl、またはpython2を好む。

+0

ファイルは*ものすごく*大きくない場合、私はちょうどVimの中でそれをやっていると思います。もしそうなら、私は個人的にはPythonでそれを行います。あなたのアプローチは私にとってはうまくいくようです。 –

+0

ギガバイト単位です。私はそれを殺すという考えを震わせる。 – Martijn

答えて

1

あなたは本当に速いawkスクリプトでこれを行うことができます。

awk -F\t '{while(NF < (numberoffields) { line=$0; getline; $0 = line $0;} print}' 
0

これは適切なフォーラムであるかどうかはわかりませんが、TextWrangler(Mac OSXの場合)などのテキストエディタプログラムが必要です。これは大規模なデータセットを扱うことができ、かなり洗練された検索と置き換えを行うことができます。

PCと同等のプログラムが必要です。

CSVファイルは基本的に1日の終わりのテキストファイルなので、ロバートの問題を解決するために必要なものです。

+0

regex検索機能を備えた完全な機能のあるテキストエディタ/ IDEを使用するのは、プログラマチックにそれを読むことよりも利点があります。 TextWranglerはおそらく大容量のファイルにも苦労するでしょう(http://faq.barebones.com/do_getanswer.php?record_id=36を参照) – Martijn

+0

データのアップロードは日常的に処理されます。文字通り何百万ものレコードがロードされます。フラットファイルを扱うときは珍しい。しかし、その違いはかなり明らかです。あなたは、エラーがどこにあるのかを確実に言うことができないファイルに、プログラムの結果を書き込み、実行し、チェックしています。テキストエディタ(シンプルまたは複合)を使用すると、検索処理が正確にこのタスク用に行われるため、分析プロセスのスピードアップを図ることができます。テストする必要はありません。それだけで動作します。場合によっては、1行または2行またはエラーレコードについてのみ話すことがあります。 – T9b

+0

明らかに、私はあなたのデータセットの実際のサイズ、またはCSVファイルの作成方法を知らない。おそらくデータベースから選択したのは悪いスクリプトでしたか?抽出スクリプトを修正できませんでしたか? – T9b

1

A Pythonのソリューション:

csv_filename = 'foo.csv' 
new_csv_filename = 'foo.fixed.csv' 
num_fields = 10 

with open(csv_filename, 'rU') as reader and open(new_csv_filename, 'w') as writer: 
    while True: 
     line = '' 
     while len(line.split('\t')) < num_fields: 
      line += reader.readline().replace('\n', ' ') 
     writer.write(line + '\n') # Or '\r\n' if you prefer 

私は、ファイルの交換を自動化しません。元のままにしておいてください。

+0

私はあなたがファイルを使って何をしようとしているのか分かりませんが、Pythonでできることがあれば、それを書く必要はありません。あなたはそれをジェネレータにすることができます( 'writer.write(...)'、 'yield ...'の代わりに関数に入れて) 'csv'モジュール(delimiter = '\ t' )。 –

+0

余分な情報をありがとうが、私はそれを出荷する必要があります。 – Martijn

+0

@Martijn:これはあなたのために機能しますか? –

関連する問題