2011年06月15日
awkの威力を思い知れ!CSV形式のテキスト処理
UNIX系OSを使っている人なら多分知ってると思うが、awkコマンドはテキスト処理に非常に強力な威力を発揮してくれる、いにしえのアプリケーションだと言い切っても良いと思う。このスクリプト言語は、CSVなどのデータベース的な構造を持つテキストデータの扱いに特化していると言うのは安直かも知れないが、むしろそう言い切った方が、awkを知らない人にとってはわかりやすいだろう。
CSV【Comma Separated Values】形式は、そのまんまカンマで区切られたカラムの概念を持つレコード形式だ。Excel等の表計算で言えば列の区切りをカンマで表したテキストデータである。これを見やすくするためにExcelにCSVをインポートしたり、CSVエディタを使用したりする。行についてはもちろんレコードを表すことになるだろう。データベースのテーブルと全く同じ考え方だ。
ところが、Excelには厄介なことがある。まず数値は勝手に数値形式で読み込むので、例えば「0001」 という値は、勝手に「1」に置き換えられてしまう。明示的にテキスト形式だと認識させるためには、ファイルの拡張子.csvを一度.txtに変更して、Excelより開く、ファイルの種類をcsv、txtとして取り込み、形式をテキストとして指定してやらなくてはならない。実に面倒な仕様である。そもそもCSV形式はテキストファイルなのだから、テキストとして開いてくれる仕様ならExcelに拡張子.csvを関連付ける意味はあるのだが、勝手な解釈をする時点で関連付ける意味は無いし、トラブルの元となる。(私の知る範囲では、少なくともExcel2003の以前では解決していない)
次に問題となるのは読み込み可能な行数とカラム(列)数だ。Excel2007以降で劇的に拡張されたが、Excel2003では6万数千行以上は開けない。OpenOffice.orgも同じ制限を持っていたが、最新版(バージョンは失念)でこの制限が改善された。ただしOpenOffice.orgのCalcでは、数万行のCSVを読み込ませると行の高さ調整中のままフリーズする・・・つまり使えない。
そこで、Cassavaや、KutoCSVエディタなどの出番となるのだが、これまた数万行となると動作が緩慢どころか、フリーズ症状となり、快適な編集作業は望めない。きょうび、たかだか50MB程度のテキストデータだと言うのに、CSV形式のファイルを快適に編集できるツールがいまだに無いのである。
CSVのデータ構造を理解している人ならば、テキストエディタ(秀丸エディタ、EmEditor、K2Editorなど)で処理した方が軽快でミスも少ないと知っているだろう。なぜこのご時世に、CSV形式のデータを表の体裁にして表示してテキストエディタの様に快適に編集するツールが出てこないのか?ニーズが無い?
いや、そんなことはないと思う。なぜならネットショップがどんどん増えている実情、サイトの更新などはCSVファイルで行っているケースがかなり多いはずだ。おそらくニーズはあるけど良いツールが無い。 そこでMS-Accessや、FileMakerなどのデータベースアプリを使っての編集というのが現実だろう。実に無駄が多い。
そこで筆頭に上がってくるのがスクリプト言語「awk」である。 awkにはFS(フィールドセパレータ)に対応したデータ構造を持つテキストデータを効率良く処理する仕組みが組み込まれている。いや、むしろそういう用途の単に開発されたとしか思えない。CSVファイルの一括編集に最高のスクリプト言語だと私は思う。なにしろ私はプログラミングはまだまだ苦手。だけどちょっとしたスクリプトは書ける。awkも手順を並べて記述していくだけで良いのであれば、十分対応できるのだ。そんなに難しい処理はさせなければ良い。
より強力なPerlを理解している人はawkなんかに見向きする必要は無い。Perlの方が新しく洗練されていて柔軟だからだ。だけどPerlの柔軟さが仇になる場合を想定できるだろうか?私にはPerlは難しすぎて理解できない。だけどawkならなんとかなる。ベタだろうが泥臭いだろうが、バカにされようが、手作業でやることを一つずつスクリプトに手順どおり記せば良いのだ。目的を達成するのが一番大切だ。言語の理想とかそんなのはプログラマじゃない私には関係なしだ。
私は、FreeBSD/LinuxでUNIX系のコマンドを覚え、ログの分析や管理をする為にawkを使うようになったが、いざ仕事で使用するCSVファイルがこのawkによって、非常に効率よく処理できるではないか!と気づいた時、awkやってて良かったと思った。しかし同時に、なぜawkという考えがもっとメジャーにならないのだろうか?と疑問に思った。いくつか原因はあると思うが、
- 基本的にコマンドラインから実行するプログラムであること
- 比較的容易とは言えどもスクリプト言語にはプログラミング的スキルが求められること
- Windows OSには標準では装備されていないこと
- 仕様が古くて柔軟性(拡張性)が乏しいとか・・
まぁ、こんな程度なのかなと思う。
1.については容易に解決させることが出来ることがわかった。「おーくの友だち」というユーティリティを使うことで、gawkコマンドをGUIで使用することが出来るのだ。実によく出来ているので、設定が終わっている環境下では、gawkというコマンドを意識させないかも知れない。
2.については、苦手意識というのが先に立っているだけのことだろうと思う。事実私自身がそうであったからだ。しかしことCSV形式のテキストデータを扱う場合においては、awkは実に良くできているので、思っているよりは容易に目的を達成することが出来ると思う。もちろん複雑な処理をするのであればそれ相応のアルゴリズムをスクリプト化しなくてはならないが、単純作業を順番にさせていくのであれば、フローを書いてそれをスクリプトに記すことで実に合理的な処理が実現できる。毎日退屈な処理を強いられている人は一度チェックしてみる価値はあると思う。
3.についてもほとんど問題ない。gawkのWindows版がオープンソースで配布されているので、ありがたく使わせていただけば良いのだ。gawk.exeを「おーくの友だち」と連携させるだけで容易に環境を準備できる。コマンドラインは意識しなくても良いので、「PATHを通す」という基本的な知識すら要らない。何も知らないWindowsユーザーのPCにセットアップしてあげれば、普通のWindowsアプリだと思って使うだろう。裏でgawkというアプリが処理の要をこなしているとも知らず。(まぁアプリケーションとはコアな部分は見えない。つまりこういうものなのだろう。)
4.については知らない。どうでもいいです。仕様が古くても目的を達成できたらそれでオッケー。手作業を毎日繰り返すなんてまっぴらごめんだ。レガシーな言語にすがろうが、目的が果たせるならそれでいい。
さて、私の手元には、数万レコード(行)はまだちょろい。数十万レコードのCSVデータが来ることもある。そのデータを手作業で処理することは不可能だと断言しよう。正規表現を使える置換機能を実装したテキストエディタ、 新しいExcel、OpenOffice.orgのCalc、Access、FileMakerなどが無いと話にならない。しかしおそらくそれらのどれよりも速く処理を済ませることが出来る「無料」で軽量なツールがある。使わない手は無いだろう。この処理を突きつけられた時、awkスクリプトを書き、数秒で処理を終わらせた時コンピュータというツールの凄さを実感する。次からは数秒の処理を日々繰り返すだけだ。空いた時間はほかの事に回せる。
「おーくの友だち」は簡単にセットアップできる。zipファイルを解凍して、別途入手したgawk.exeを同一フォルダにCOPYする。任意のフォルダにおいても良いが192KB程度の小さなプログラムなのであちこちに存在しても影響は無い。Fowawk111フォルダに一緒に入れておくのが私流。それにはシステム管理者としての経験(ノウハウ)も入っている。
次にgawk.exeの場所を設定しなくてはならないので、ForAwk.exeを実行して、「ファイル」-「環境設定」をメニューから実行し、設定画面を開く。そしてawk.exeの所在を設定する。この時点ではPATHがフルパスで記録されるが、setで確定させておーくの友だちを終了する。
FORAWK.INIというファイルがあるので、ダブルクリックしてメモ帳で開く。そして下記の部分を書き換えて保存する。
Path=C:\Program Files\Fowawk111\gawk.exe
Path=gawk.exe
たったこれだけのことだが、これでForAwk.exeと同一ディレクトリにgawk.exeが有るという設定になったので、Fowawk111フォルダを移動させて、仮にデスクトップに置いたとしてもそのまま使用し続けられる。職場の管理者の場合は、この設定をしておけばOSがXPだろうが、WIndows7だろうが関係なしに持っていけるので便利だと私は感じている。(当方のWindows7 32bit環境では問題なく動作したが、64bit版ではgawk.exeが動作しないと言うレポートをどこかで見た)
- スクリプトはどんどん追加して行けるし、プルダウンから選ぶことが出来る。
- スクリプトの種類はOne-Liner(一行野郎)でも可能だ。
- 処理したい対象ファイルは、広い枠の中にドラッグ&ドロップで放り込めばパスを認識してくれる。
- Runで対象データに対して処理(スクリプト)が適用される。
- 結果は、Outputで選べるが、上図の場合は、元ファイル名にPreFixが付加されて、new_articles.csvとして保存される。
- gawk.exeがSJISにしか対応していないので、残念ながら処理できるデータの文字コードはSJISのみとなるみたいだ。(他のgawkを使えばUTF-8、EUCなどにも対応できるかも知れないが未確認。)
見てのとおり、処理をさせたい対象ファイルの順序も変更できるし、至れり尽くせりかつ必要なUIは揃っている秀逸なフロントエンドアプリケーションだと私は思う。とても裏でいにしえのawkというコンパクトなプログラムが高度なテキスト処理を高速にこなしてるとは到底思えない。
ちなみに20万行(レコード)のCSVデータに、2つの処理を適用させてみたところ、5秒ほどで処理が終わった。使ったマシンのCPUはCore i7-870だが、比較的古いマシンでもそんなに待たされることは無いだろう。素晴らしくコンパクトで軽量なプログラムとそれを強力にサポートする秀逸なフロントエンドの組み合わせである。
投稿者 sasapurin : 22:15
| コメント (0)
| Windowsアプリ
, オープンソース系
, コンピュータ
, プログラミング
| トラックバック
|
2010年11月04日
Pythonの勉強中(今のところ順調)
先日買ったPythonの本、ちょっと回りくどい印象を受けたけど今のところ順調に飽きずにちょっとずつ読みながら実践しながら理解している。この著者の説明は丁寧だけどツボを抑えていて飽きないので私に合っているっぽい。
データの型とかは、変数の型と同じだろ?それくらい過去に何度も(そこの部分だけは)勉強してるってば・・って思っていたけど、そういう単純なものではなく、その型に応じた便利な機能(コマンドというか関数というか)があるらしく、読み進めながら実際にやってみるとなるほど~とうなずくことが多い。Pythonにはインタラクティブシェルがあるので一行プログラムを入力して変数に値を代入してみたり、それを表示させてみたりと言うことが簡単に出来て学習しやすい。
Pythonだけじゃないと思うのだが(PHPも確かそうだった気がする)数値同士を+すれば合計値が出るのは分かるけど、文字列を+すれば連結出来たりするのは意外というかそれってアリなん?と思ったりもするけれど覚えるのが楽なので便利だなぁと思ったりする(言語によっては&を使うケースもあるね)。もちろん便利に使える様に考えられて作られているから個性を持った色々な言語があるんだとは思うが。この本でオブジェクト指向を無意識に学習出来てるんだなと感じる部分が所々ある。
- プログラムを作ろう
- プログラムの材料と道具
- データと型のすべて
- データの入れ物
- 条件分岐と繰り返し
- ファイルの読み書き
- Pythonで画を描く
- 関数を作る
- 新しいデータ型を作る
- 本格的なプログラミング
- 付録
しかし現在は10章ある内のまだ4章だ。しかも5章目がいつも躓く条件分岐&ループ処理だ。これマジで苦手なんだよね。ここを乗り越えて6章のファイルの読み書きが出来るようになったら、色々な素材をネットから入手して(郵便番号データなどのCSVファイルでも良いと思う) 色々な事を練習出来るようになると思う。もうひとがんばりだ。きっと視界が広がるんだろうな~って前向きに考えておこうっと。仕事じゃないんだから楽しく勉強するよ。
なお、章の途中でこの本を一通りクリアした後のことに触れられていた。そのなかで紹介されている書籍「みんなのPython」は先に入手していて地道に読んでいたが理解出来ないところが多くて躓いたまま放置だった。どうやら次のステップとして良い本らしいので、順調に今の本を読破出来たら次の道も見えてきたという感じだ。そういえばほとんど内容を覚えて無い・・
やっぱり地道に勉強しつつ、でも楽しみながら何かを作ったり改造したりしながら学習していかないとこういうのはうまく覚えられないんだと思う。私はどうもレール通りには歩けないタイプらしいので窮屈すぎる本は途中で飽きてしまう。なんとか読破して次のステップに煤みたいものだ。焦らず頑張ろう~
投稿者 sasapurin : 23:51
| コメント (0)
| Python
, コンピュータ
, プログラミング
, 書籍
| トラックバック
|
2010年10月31日
Pythonスタートブック
以前からプログラミングには挫折させられっぱなしだが、その原因の一つはモノクロ9インチなMacintosh(ClassicII)でやろうとしたこともあるだろうな。当時はInside Macintoshという高価な本が無いと何も出来なかったので一冊1万円位するのを数冊買ったし、コンパイラにしてもウン万円かかった・・・だけど当時はネットもないし本も何を買ったらよいか分からない状態で模索しながら買ってきて読んだけどなかなか壁が越えられずプログラミングスキルは身に付いていない。もうこれ以上は思い出したくない..orz
そんな私だが、ExcelとAccessはそこそこ使える。VBAは苦手なのだが、特にExcelは関数とマクロを使えばちょっとしたことが出来ちゃうので便利だ。これをプログラマの知人が言うには、Excelでここまで出来るなら絶対にプログラミング出来ると言う。そして性格的にも絶対に向いていると言われる。
だけど私は全然プログラミングが出来ない。せいぜいBATファイルを書いたりシェルスクリプトを書いたりという手続き型の上から順番に実行していく感じの処理しか書けない。変数やら関数やらも概念的には理解しているけれどそれでなぜプログラムが組めるのかが分からない。
知人いわく、「難しく考えすぎ」と一喝されたが・・
だけどやっぱりプログラミングが出来るのと出来ないのとでは、コンピュータをツールとして使う身としては天と地の差があるので、また懲りずにチャレンジしてみようと思っている。以前から着目していた「Python」で行こうと思っている。理由は持っている携帯電話Nokia N73(705NK)にPythonがインストールされていて組める様になったら何か作れるんじゃないかなと(w
いや、本当のところはPythonは覚えることが少なくて済む言語らしいし、だからと言って非力な訳でも無くむしろ強力な開発言語だと聞く。インデントなど記述の仕方も統一されているらしいので可読性も高い(サンプルコードが読みやすい=勉強しやすい)というのも理由だ。発展的な事も視野に入れると強力な各種フレームワークがあるのでもし壁を越えたら世界が広がるかなと。一応考えているのである。
と言うわけでPython本買った。
読んでみたところ、ぶっちゃけ、さすがにこれは初心者向け過ぎるだろって最初は思った。変数の型とか一応色々な言語で何度も勉強したし今更・・・
ところがだ・・Pythonのオブジェクト指向な考え方を解説してくれていたんだなこれが。おおなるほど~ちょっと見えてきた感じがする。絶対に理解出来ないと思っていたオブジェクト指向。確かに難しく考えすぎだったのかも知れない。後は数をこなすことだな。サンプルをぱくりながら色々作ってみることだ。 もしかしたらこの本で壁越えられるカモ知れない。
結構、比喩を使った回りくどい説明と思われる文章があるのだが、この比喩は比較的理解しやすいのだ。過去にC++のオブジェクト指向を解説した本で、ロボット犬を作るという題材の本を読んだんだが、誤植は多いし意味不明だし何を伝えたい(教えたい)のか全く意図が読めなくて(英文の翻訳本だったから翻訳の質が悪かったのかも)あれは史上最強究極の駄本だなって思うんだけど、 この本の比喩はイイ感じだ。
今度こそ諦めずにPythonをものにしたいな。最近はネットで調べれば色々なヒントが手に入るから本を買い求めに行く時間がなくてもなんとかなりそうだ。かつて越えられずに来た壁さえ越えられればね。少し向こうが明るくなった気がする。
投稿者 sasapurin : 01:43
| コメント (0)
| Python
, コンピュータ
, プログラミング
, 書籍
| トラックバック
|