python で uniq コマンドもどきを書いた(CSV対応)

ここでは、「python で uniq コマンドもどきを書いた(CSV対応)」 に関する記事を紹介しています。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
python で uniq コマンドみたいなものを書いた.いきさつは以下のとおり:


uniq コマンドにバカでかい CSV ファイルを食わせたら,

セグメンテーション違反です

とメゲてしまった.頑張れよ,uniq.cat も sort も awk も大丈夫だったのに...
まぁ、1行がメガバイト単位なCSVを食わせるのが悪いのかもしれんね。

環境は

$ uname -a
Linux tekitobibouroku.jp 2.6.18-164.ydl.3 #1 SMP Mon May 10 13:46:45 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

uniq のソースをチラ見したが、バッファを固定値で取っているモヨン。修正する根性がないので,代替手段を探しに出かけた.


すると,python で uniq コマンド的なものを作られた方の記事を発見した.
Pythonでuniqコマンドのように重複行を削除する
そうかこの手の処理も python でいけるやんか.感謝!


さて,こちらの python のバージョンは

$ python
Python 2.4.3 (#1, Sep 3 2009, 15:37:37)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2
Type "help", "copyright", "credits" or "license" for more information.




自分の状況では CSV ファイル,すなわち「各行内にカンマが入っている」データを処理したい.カンマのせいか,set で重複を弾こうとすると不具合が出る.
あんまり綺麗じゃないけど次のようになった:

#!/usr/bin/python
import sys
data = []
last = ""
for line in sys.stdin:
  if line != last:
    data.append(line)
    last = line
for a in data:
  print a,

その場で標準出力に投げればメモリも食わなくて安心的:

#!/usr/bin/python
import sys
lastline = ""
for line in sys.stdin:
  if line != lastline:
    print line,
    lastline = line

綺麗かどうかは分からんが,短くはなった.これを uniq.py とでも名づけて保存し,chmod u+x ./uniq.py とかすれば実行できるようになる.
スピードが出るのか心配だったが,自分の用途に関しては特に問題はなかった.


案外フィルタも書きやすいのかも試練とオモタ.Python いいな.
スポンサーサイト
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://tekitobibouroku.blog42.fc2.com/tb.php/294-08ab1de4
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。