正直に書くブログ

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

お勧め

awkとsedでテキスト加工の自動化

さて、昨日awkを久しぶりに使ったのですが、現在勉強中のVisual Studio C#でWindowsアプリとして作ってみようと思っているツールを、awkとsedなら簡単に作れちゃうんじゃないか?って単純ロジックがイメージ出来てしまったので極単純に手続き型っぽくスクリプトに記してみました。全くプログラミングっぽくありません。

ここでネックはWindowsには標準ではawkもsedもコマンドがありません。後からフリーのコマンドをDLしてきてインストールすることも可能なのですが、wgetも使いたいし、ここまで来ちゃうともう煩わしいので、Cygwin(UNIXコマンド集みたいなアプリ)が使える環境でやってみました。

お題は、とあるグラビア画像系サイトからソースをwgetしてきて、ダウンロードリストを作ってしまうところまでとします。ダウンロードリストを元にwgetで画像ファイルをダウンロードする部分もスクリプトに含めれば、完全自動処理が出来てしまいますが、そこは今回の記事の範疇外とします。実際のところダウンロードの処理も自動で行う所まで、結構容易にできちゃいます。(気が向いたら後日記事にします)

画像ファイルが保存されているURLをテキストファイル1つにまとめられたら、そのURLリストをIrvine等のダウンローダーにインポートすれば、後は自動でDL出来ますね。ツールの組み合わせならちょっとした頭の切り替えで容易に実現出来ます。

Cygwinのインストールは楽勝だと思うので、今回は触れません。興味を持った方は是非Cygwinについて調べてみて下さい。Windowsというコンピュータがもっとコンピュータらしく使える上に身近になってくると思います。

ちなみに、Mac OSXはUNIXなので標準で同等のコマンドが使用出来るハズです。保証は出来ませんけど。さあ!Windowsユーザー達よ、Macユーザーに負けてられませんよ(w

続きを読む

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でも不自由なく使用できるのがありがたいことです。

続きを読む

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コード
  • ライブドアブログ