2011-12-03 2 views
2

...どこかで入手可能なcsvファイルを操作する簡単なスクリプトがありますか?私は、一般的なCSVファイルを操作できるようになるいくつかのスクリプトを探しています

一般的なもののように:

  1. アドオン行FILENAMEのINSERT_ROW
  2. 取得行FILENAME GREP_ROW
  3. 置き換え行FILENAME GREP_ROW INSERT_ROW
  4. 削除行FILENAME GREP_ROW
ヘッダーを含む最初の行と

  • FILENAME CSVファイルの名前は、「」を含む可能性がある文字列を区切るために使用

    「」

  • GREP_ROWペアの列フィールド1 =値1 [、フィールドN =値N、...]は、CSVファイルのフィールド値に基づいて行を識別するために使用されます。
  • INSERT_ROWフィールドの置換(または追加)に使用されるフィールドの組のフィールド1 =値1 [、フィールドN =値N、行の
Pythonでpeferably

CSVパッケージを使用して... 理想的な変数として、各フィールドを関連付けるためのpythonを活用し、フィールドN> XYZなど、より高度なGREPルールを可能...

答えて

0

Pythonで通常の方法でありますcsv.readerを使用してデータをタプルのリストにロードし、そのネイティブのpythonオブジェクトに対して追加/置換/取得/削除操作を行い、次にcsv.writerを使用してファイルを書き戻します。

CSVファイルのインプレース操作はあまり意味がありません。レコードは通常固定長ではないので、他のすべてのレコードを同時に移動することなく、レコードを挿入、削除、または変更する簡単な方法はありません。

つまり、Pythonのfileinput moduleには、インプレースファイルの更新用のモードがあります。

4

Perlは、UNIX哲学から派生したインプレース編集の伝統を持っています。次のように

私たちは、例えば、単純なadd-row-by-num.plコマンドを書くことができます:

#!/usr/bin/perl -pi 
BEGIN { $ln=shift; $line=shift; } 
print "$line\n" if $ln==$.; 
close ARGV if eof; 

は、行を置き換えるために$_="$line\n" if $ln==$.;によって第三のラインを交換してください。 $line=shift;を削除し、3行目を$_ = "" if $ln==$.;に置き換えて行を削除します。

次のように我々は、単純なadd-row-by-regex.plコマンドを書くことができます:

#!/usr/bin/perl -pi 
BEGIN { $regex=shift; $line=shift; } 
print "$line\n" if /$regex/; 

それとも単にperlのコマンドperl -pi -e 'print "LINE\n" if /REGEX/'; FILESを。再度、交換または削除のためにprint $line$_="$line\n"または$_ = ""に置き換えることができます。

各ファイルの処理後にカウンタ$.を停止する必要がないため、close ARGV if eof;行はもう必要ありません。

普通のUNIX grepユーティリティでは不十分な理由はありますか?正規表現(PATERN){n}PATERNと正確にn回一致することを思い出してください。つまり、(\s*\S+\s*,){6}{\s*777\s*,)は7番目の列に777を要求します。

私はsplitmap、およびjoinを自分自身を使用すると思いますが、この正規表現にあなたのfieldN=valueペアを変換するためのPerlの正規表現は、さえあります。

Btw、File::Inplaceは、ファイルハンドルのインプレース編集を提供します。

+0

必要に応じてText :: CSVモジュールもあります。 –

+0

トリックはfield = valueはフィールドと同じ名前のヘッダが同じ値を持つ必要があることを意味します...例えば、csvの私の最初の行はcountry、town、zipとmy querryかもしれません私たちと一致する行のzipフィールドの内容を置換するように指示する "town = NewYork、country = us" "zip = 10010" replaceYear foo.csv "NewYork = 10010 ... – user1078518

+0

この場合、開始行正規表現を構築する必要がありますが、おそらくCSVモジュールによってはそれをより簡単に処理できます。 –

4

PerlにはDBD::CSVドライバがあります。このドライバを使用すると、CSVファイルをSQLデータベースのようにアクセスできます。私はそれ以前に演奏してきましたが、広範囲に使用していないので、徹底的にレビューすることはできません。あなたのニーズが十分に単純な場合、これはあなたのためにうまくいくかもしれません。

関連する問題