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という考えがもっとメジャーにならないのだろうか?と疑問に思った。いくつか原因はあると思うが、

  1. 基本的にコマンドラインから実行するプログラムであること
  2. 比較的容易とは言えどもスクリプト言語にはプログラミング的スキルが求められること
  3. Windows OSには標準では装備されていないこと
  4. 仕様が古くて柔軟性(拡張性)が乏しいとか・・

 まぁ、こんな程度なのかなと思う。

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が動作しないと言うレポートをどこかで見た)

おーくの友だち-UI

  1. スクリプトはどんどん追加して行けるし、プルダウンから選ぶことが出来る。
  2. スクリプトの種類はOne-Liner(一行野郎)でも可能だ。
  3. 処理したい対象ファイルは、広い枠の中にドラッグ&ドロップで放り込めばパスを認識してくれる。
  4. Runで対象データに対して処理(スクリプト)が適用される。
  5. 結果は、Outputで選べるが、上図の場合は、元ファイル名にPreFixが付加されて、new_articles.csvとして保存される。
  6. gawk.exeがSJISにしか対応していないので、残念ながら処理できるデータの文字コードはSJISのみとなるみたいだ。(他のgawkを使えばUTF-8、EUCなどにも対応できるかも知れないが未確認。)

見てのとおり、処理をさせたい対象ファイルの順序も変更できるし、至れり尽くせりかつ必要なUIは揃っている秀逸なフロントエンドアプリケーションだと私は思う。とても裏でいにしえのawkというコンパクトなプログラムが高度なテキスト処理を高速にこなしてるとは到底思えない。

ちなみに20万行(レコード)のCSVデータに、2つの処理を適用させてみたところ、5秒ほどで処理が終わった。使ったマシンのCPUはCore i7-870だが、比較的古いマシンでもそんなに待たされることは無いだろう。素晴らしくコンパクトで軽量なプログラムとそれを強力にサポートする秀逸なフロントエンドの組み合わせである。

コメント

Comment spam is annoying.

There has been an increase in comment spam, but we decline it. It’s pointless because we use Akismet to block spam comments. Spam comments will not be posted.

コメントスパムが増えていますがお断りします。akismetでスパムコメントを弾いているので無意味です。スパムコメントは掲載されません。

ブロックしたスパム

DMM広告

タイトルとURLをコピーしました