2017-12-13 4 views
-2

私はつまり、私は手動で3つのUNIXの操作を実行した上でスペース区切りファイル(file1.csv)を、持っています。各ラインからすべての二重引用符( ")を削除する。やって基本的なUNIXの操作Python的な方法

sed 's/"//g' file1.csv > file_tmp1.csv 

STEP2。任意の行の先頭で、すべての空白を削除する。

sed 's/^ *//' file_tmp1.csv > file_tmp2.csv 

STEP3。それぞれの文章の間にあるすべての追加の空白を削除しますライン。だから、

cat file_tmp2.csv | tr -s " " > file1_processed.csv 

、私は計算-時間の多くせずにPython的な方法でこのおよびそれに任意のより良いアプローチがありますかどうかを知りたいと思いました。これらの3つのステップは、やる程度〜5分(max)をとりますUNIXコマンドを使用しています。

ファイルfile1.csvは、で区切られたファイルですので、スペース区切りにしてください。

解決方法でメモリ全体にfile1.csvをロードすることが示唆されている場合は、毎回メモリにロードするにはファイルが大きすぎる(〜20 GB程度)ため、これがチャンク内で行われる方法を提案してください。

ありがとうございます。

+2

私はあなたがUNIXツールの性能にさえ近づくことはできません。これらのツールはC言語で書かれており、パフォーマンスのために高度に最適化されています。 – hek2mgl

+0

あなたはPythonでそれを行う必要がありますか、または単にPythonが速くなると思いましたか? – user1767754

+1

多分、配管、少なくとも、コマンド?中間ファイルが生成されず、シングルパスが与えられたファイルを変換するようなことはありませんか? –

答えて

2

明白な改善点は、trのステップをsedに変換し、すべての部分を1つのジョブに結合することです。まず、テストデータ:

$ cat file 
"this" "that" 

仕事:

$ sed 's/"//g;s/^ *//;s/ \+/ /g' file 
this that 

はここに1つのawkにおけるそれらのステップのすべてです:あなたはそれをテストする場合

$ awk '{gsub(/\"|^ +/,""); gsub(/ +/," ")}1' file 
this that 

は、私はそれがかかった時間を知らせます。

0

ここでは、一度に1行を読み込み、Pythonで指定した置換を実行するプロセスを示します。

with open('file1.csv') as source: 
    for line in source: 
     print(' '.join(line.replace('"', '').split()) 

split()のデフォルトの動作は、任意の主要な(と末尾)の空白をトリミング含まので、我々は明示的に指定しないでください。末尾の空白を残す必要がある場合は、おそらく要件を更新する必要があります。

複数のテンポラリファイルと複数の起動(sed)を使用しているシェルスクリプトの試行は、シェルでこれを行う方法の良い例でもありません。

関連する問題