正直に書くブログ

2012年9月からフリーランス活動開始しました。
今後もマニアックでも有用な情報を提供出来るように頑張ります。

awk

awkスクリプトでパターンマッチングを複数回行う

知人から相談を受けてawkを久しぶりに使う事になりました。

最初はMS-Accessについての相談だったのですが、要件を聞いてみると元ソースはテキストファイル(CSV形式)ですし、Excelのイメージで言うと1つのセルに必要な情報がいくつも入っている状態なので、ExcelやAccessよりもawkで処理した方がスマートだと判断しました。

もっとも、置換機能によって不要な情報削除も必要なので私のスキルではawkだけでは無理でした。おそらくCygwinも入っていないWindows環境で処理されるのでsedも使えません。awk、テキストエディタ(正規表現置換)、sort、uniqの組み合わせで出来るだろうというイメージが出来ました。

sortはWindowsに有るコマンドですが、uniqに関しては無いので作るしか無いですね。もしくはユーティリティーを探してきてuniq抽出するか。

いずれにしても肝となるのは、やはりawkです。awkは簡単に使えて結果が得られる素晴らしい言語ですね。結構古いので廃れてる感はありますが、私的には最も助けてもらっているスクリプト言語です。

続きを読む

おーくの友だち+gawkでテキストファイルをマージ

今日は久しぶりにPCを使ったお仕事です。最近PCをあんまり仕事で使わなくなったので、メールチェックを始めスマートフォンばっかり使っています。

さて、今日はお仕事の関係であらかじめ手元に確保しておきたいファイルをネットで集めてくる作業をしようと思ったわけです。Web関係の仕事をする以前はHTMLの知識ですら概念的な学習で、実践が伴わなかったものですが、すっかりHTMLだけでなくJavascriptも一応読めるスキルが身についている様で、ソースを読んで規則性を見出し、URLリストを生成してダウンロードツールで自動的にダウンロードさせるべく横着する方法を考えます。

ちなみに未だに使っているダウンロードツールはIrvineです。Irvineは非常に優れたダウンローダーで、Windows 7でも不自由なく使用できるのがありがたいことです。

続きを読む

MIFES 9がCSVデータ編集の最強ツールになるかも!

MIFES 9ベータ版が公開されているので試してみた。理由はずばり、強化されたCSVモードの実装セル(列)内で改行されていても読み込める様になったそうだ

CSV形式のファイルを編集する際、Excelで回りくどい開き方と保存の手間を強いられ、うっかりするとデータが化け(型を変換される)てしまうという煩わしさに苦悩してきた。

比較的データ量の少ないCSV形式の処理にはCSVエディタが適しているが、データ量が多くなるとべらぼう遅くなるので、ネットショップの商品データCSVの処理には向かない。特にアパレル系は、一つの品番に色とサイズが存在するので、データ数はどんどん増える。

同様にJANデータの管理も、もはやExcelでは追いつかず、Accessに取り込んで行うことになっていた。当然ながら入出力の繰り返しで、型の変換を勝手にやられてしまうとうっとうしい事この上ない。

そこで私はテキストエディタ(EmEditor)を使用している。慣れてくると表になっていなくても編集できてしまうし、何よりも膨大なデータでもサクサクと処理できるので快適に思っていた。しかしその上を行くのがawk言語によるスクリプト処理で、簡単な手順をスクリプトに記したり、一行コマンドで処理してもあっという間に結果がファイルに出力されるので、もはや最強だろうと思っていた。(もちろんPerlやRubyなどのより強力な言語を扱えればそれにこしたことは無いが、私はプログラマーじゃないのでawkを扱うので限界だ)

しかしawkには致命的な弱点がある。1行=1レコードというルールが崩れると正しくレコードを認識できない。今時のCSV書式の常識では"ダブルクォーテーション"でフィールドを囲む事によって、途中で改行されていてもそれは文章中の改行だと判断させることになっているが、awkのパーサはそれを標準では理解してくれない。

そんなところへひょっこり現れたのが、CSVモードを洗練させたMIFES 9である。

テキストエディタという地味なツール故、知らない人も多いだろうが、MS-DOSな時代から販売されている強力なテキストエディタで、私が初めてPC(パーソナルなコンピュータという本来の意味で)を扱う様になった職場では、Dynabook J-3100にMIFESスクリーンエディタがインストールされていた。MS-DOSに標準実装のエディタ、EDLINコマンド(一行ずつ表示して編集)なんか使ってられないと痛感した。

あれから15年位は経っているだろうか?いまだにMIFESが生き残っている事に驚いた。想像するにプログラマー、ライター(もの書き)等の根強い支持を受け続けてきたのだろう。それだけ完成度の高い、洗練されたツールであると評価しても良いだろう。(MIFES 8でアクティベーションが採用され、ライセンスが厳しくなった事より、コアなユーザーにそっぽ向かれたという情報を見て、MIFES終わったなと思ったのをなんとなく記憶している)

そんなMIFESが9というバージョン番号を掲げて再び市場に現れた。アクティベーションは廃止、個人ユーザーなら1ライセンスで2台のPCまでインストール可能。USB版を作成する機能も付いているとか。

そして目玉は、進化したCSVモードである。これは圧巻であった。大容量データを開いた時のCSVエディタのどんくさい動きを、存在が無意味だと思わされる位に快適だ。なにしろテキストエディタなんだから動作が軽い。

某、ドロップシッピングの商品データCSVを落としてきて、MIFES 9のベータ版で開いてみた。流石に20万レコード以上、ファイルサイズにして250MBのCSVデータを開くと数秒はかかるが、開いてしまえば編集は快適である。やはりテキストエディタだけのことはある。

CSVモードに切り替える時は、セパレータ(カンマ)、囲み(ダブルコーテーション)等の指定をする。数秒でセパレータで区切られた表形式に整形される。今時のCSVの書式を正確にパースしてくれる。これならテキストエディタでも見やすくCSVデータを表に整形した上で編集できるだろう。ExcelでCSVファイルを開く際の型指定が無いだけでも手間とは感じない。

しかし、一行目(列見出し)を固定する方法が見当たらない。今回の試用では20万レコードを編集する。ならば列見出しの常時表示は必須である。特に状態フラグ等を表す列で、0か1の値しか持ってない場合は、どの列がどの項目なのか分からないと編集が出来ない。せっかく表形式に整形してもらってもあんまり意味がなくなる。CSVデータの編集ならではのニーズだろうがその配慮は欲しい。

まだベータ版なので、フィードバックで要望を2つあげた。実装されるかどうかは分からないが、CSV編集をする上で欠かせない基本機能なので期待をしている。

おそらく私はMIFES 9を購入するであろう。それは作業の効率アップが確実に期待できるからだ。職場で購入してくれるかどうかは分からないが、個人的に購入してででも使用するつもりだ。なにしろ扱うファイル形式が基本的にTXT形式なのだから、Offceアプリの様に互換性うんぬんをい気にする必要が無い。私はプログラマーでは無いが、SubversionやVSSとの連携によるバージョン管理機能も魅力的だ。

最後のブラッシュアップを開発元が決めてくれたら、ネットショップ業界でも欠かせないツールになりかねないパフォーマンスを秘めているだけに、かなり期待している。

本当はあんまり教えたくない情報でもあるが、MIFESの開発が中止してしまうとこれも問題なので、良いものには売れてもらわないと困るから紹介する事にした次第である。

日々、膨大なCSVデータを扱う人は是非、ベータ版(致命的なエラーにはまだ遭遇していない)の検証を行い、フィードバックを送って完成品の購入を検討していただきたい。

良いものが必ずしも生き残る時代ではないだけに、良いものはユーザーが口コミででも広げていかないといかないと思っている。最後は自分に帰ってくることだから。なんとなくでも興味をもってくれた方は、概要が読み取れる元麻布氏のレビュー記事を読んでみて欲しい。


awk単体では出来ないケースが実は多い(ビギナー)

awkを仕事で扱うCSVファイルの編集に使用している事を先日のエントリーにも記しましたが、実に便利なコマンドです。今日は楽天への商品アップロードCSVファイルからコントロールフラグをカギにしてレコードを抽出し、そのレコードだけをawkで取り出すという実に簡単なawkの処理をしました。

社内ではシステムからCSVを生成してそれをアップロードしています。その中から削除した商品レコードだけを取り出す必要が生じたのです。

しかし、楽天の商品データitem.csvには商品説明欄もあり、ここに改行コードが入っているので、そのままではawkで処理できません。なぜならawkは改行コードをRS(レコードセパレータ)として扱うからです。もちろんRSを別の文字列などに変更することもできますが、改行とレコードの末端との区別が付く様に加工してやらなくてはなりません。

少し悩みましたが発想の転換をすることにしました。レコードの末端ではなく先端にマーカーをつけることにしました。awkで処理できる形に成型する作業ですから、テキストエディタ(正規表現置換)で行いました。

規則性を再確認してみましたが、レコードの先端には"(ダブルコーテーション)とコントロールフラグが入っています。

"u","xxxxxxxx","yyyyyyyyy"
"d","vvvvvvvv","nnnnnnnn"
"n","ppppppp","ooooooo0"

こんな感じです。uはアップデート(更新)、dはデリート(削除)、nはニュー(新規)という意味らしいです。

商品説明のカラムに改行が入っていてこの規則性(1レコード=1行)が成り立ってない為に、awkがそのままでは使用できないので、第一カラムにマッチした場合は、そこがレコードの先端だと判断する事にしました。つまり正規表現では下記の様になると思います。^は先頭を意味していますし、"は特殊文字なので\でエスケープが必要です。

/^\"u\"|^\"d\"|^\"n\"/

ただ、この正規表現にマッチした場合、その先端にマーカー@を付けるとした場合の置換方法を私は知りません。仕方ないので一つずつ実行するしかありません。置換作業を三回繰り返しです。

/^\"u\"/ >>> @"u"
/^\"d\"/ >>> @"d"
/^\"n\"/ >>> @"n"

とにかくこれでレコードの頭に@が着きました。

次に改行コード(\n)を削除します。これも正規表現でマッチさせられますので、\nを何もナシに置換します。改行が削除されるので、正常に出来たら一行のデータになってしまいます。

ここで先ほど付けた@の出番です。@を改行(\n)に置換すれば、目的は達成です。これで1行=1レコードのCSV書式となります。なーに、商品説明欄は要らないのですから改行コードを抹殺しても構わないのです。

今回はdフラグを付けたレコードのみを抽出したいのです。awkなら$1=="d"で簡単にチェック出来ます。実際はダブルクォーテーションをエスケープしなくてはならないので円マークを前に付ける必要がありますけどね。

$1==\"d\" {print $0;}

今回の作業の様に、awkだけでは解決しないケースは結構あります。PerlやRuby、PHPなどではCSVのカンマ区切りと、データを””で囲っているという構造に対応しているので、改行コードが入っていてもそのまま処理できるそうです。awkは古い言語ですから仕方有りません。

その代わり、プログラミングビギナーにも比較的容易で、目的を達成できるのがメリットです。柔軟性が無いというのがむしろ簡素だという点でプログラミングが苦手な私はawkを評価しています。

もちろん更にawkの使いこなしを理解すれば、今回のケースでもawkだけで処理できると思います。しかし私はプログラマーでは無いので、何がなんでもawkだけで処理を完結させる必要はありません。他の方法と組み合わせてでも、仕事をなるだけ早く正確に終わらせるのが一番の課題です。(もちろん今後もawkについての学習は進めますけどね。)

でも、もしどうしてもawkでは話にならない、ということになったらその時は私も成長したと言うことで、次へステップアップする時期だということでしょう。それは現時点想定できませんがもしそうなったら喜ばしいことです。

おーくの友だち+gawkでCSVファイル編集無敵!

仕事がら、CSVファイルを編集する機会が多い。CSVファイルを編集する作業となると、一般的にはExcelを使用すると思うが、実に余計な事をしてくれてトラブルの元となるのでExcelは極力使いたくない。

具体的には、桁数の大きい数字を「文字列」ではなく、「数値」と勝手に解釈してくれたり、かっこで囲った数字をマイナス値として勝手に解釈してくれることなど。

「CSVファイルなんだから文字列として編集させてくれ!Excelは見やすく表に整形してくれるだけでええねん!」と声を大にして言いたいが、私の知っている範囲では、Excelを純粋なCSVエディタとして気楽に使用する方法は見あたらない。

勿論、拡張子を一度.TXTにしておいて、Excelから開くとして、カンマセパレートとか、文字列として取り込むとか、ウィザードで指定しながら取り込めば目的は達成出来るのだが、うざったくて仕方がない。

KutoCSVエディタがこの穴埋めをしてくれると期待していたのだが、レコード数が多くなると、べらぼう重くなってフリーズした様になる。とてもテキストエディタの様な軽快な動作は期待出来ない。PCのHDDランプを見ているとチラチラと点滅しているので、ディスクアクセスがボトルネックになっていると思われる。きょうびのアプリとしては、メモリー実装量に余裕があるならRAM上で処理して欲しいものである。改良を期待する。

そんな訳で私はプログラムを作れる方には、是非ともCSVの編集作業をサクサク快適に大量のデータでもパフォーマンスが落ちない仕組みでツールを開発して欲しいと本当に願っている。ネットショップを運営する人も多くなっているからニーズは間違いなくあると思う。残念ながら私にはそのかゆい所が分かるが、それを解消するツールを作る能力が無い。

ちなみにExcelは2007からは開けるレコード数(行数)が格段に多くなったが、それよりも古いExcelは6万何千行かで制限があある。OpenOffice.orgのCalcも最新版はこの制限が取れたので、かなり期待したのだが、レコード数の多いCSVを取り込むとフリーズする。つまり信頼性に欠ける。一番手っ取り早いのは正規表現の置換機能を実装したテキストエディタだったりする。しかしルーチンワークには向かない。

ここでもう、繰り返し同じ作業を毎日行うならスクリプト言語の出番だろうと、以前も記したawkの出番だと私は思った。ただ、UNIX系由来の古くから有るアプリケーションなので、コマンドラインでの操作が前提となる。ここがWindowsで育った人でそこを脱していない人には大きな壁になる。(Mac OS XはFreeBSDベースなUNIXなので、おそらくawkは標準で実装されていると思われるが検証する環境が無いので・・)

続きを読む
記事検索
月別アーカイブ
SEO的な実験
RSS

ブログランキング

track feed 正直に書くブログ
メンバー
最新コメント
スポンサードリンク
QRコード
QRコード
  • ライブドアブログ