近頃寒いですね。こんな寒い日はお鍋で一杯。
お外は寒くても心はホクホクな大崎です。 日本酒でお鍋をつつきながらインターネットを徘徊していたら、こんなblogを見つけました。
http://d.hatena.ne.jp/naoya/20130209/1360381374
最近はログフォーマットにLTSVというものを使うのかー。DataSpiderでもアダプタ作らないといけないかな。
なんて考えながら読んでいましたが、読み進めていくうちに、これはCSVアダプタとMapperを組み合わせて解析できるのではないかと思ったので、実際に解析してみました。
LTSVとは?
LTSVはLabeld Tab-separated Valuesの略で、タブ区切りのテキストフォーマットで各カラムは「:」で区切られたラベルと値で構成されています。
カラムの値ががラベル付けされるので、通常のCSV(カンマ区切り)やTSV(タブ区切り)のようにカラムの順序に依存することがありませんので、より柔軟で拡張性が高くなります。
スクリプト解説
それではスクリプトについて説明したいと思います。
スクリプトはこのようにCSVから読み取ってMapperでラベルから値を取得して、出力先のXMLに書き込みます。 CSVの読み取りでは、タブで区切ってテーブルデータとしてMapperに渡します。
Mapperの中ではそれぞれのカラムからラベルに対応する項目を抽出して出力に渡します。
ラベルに対応する項目を取得するために、次のユーザ定義ロジックを定義しています。 ユーザ定義ロジックの中ではそれぞれのカラムをラベルと値に分離して、入力から受け取ったラベルの値と比較して連結ロジックで連結します。
ラベルにマッチする値を選択するときにswitchロジックを使うこともできますが、このようにラベルにマッチする値だけを取り出して、それ以外は空文字列を連結ロジックに渡すことで必要な値だけを取り出すことができます。
このようにして作られたスクリプトに以下のLTSVフォーマットの行を与えると、
host:127.0.0.1
ident:-
user:frank
time:[10/Oct/2000:13:55:36 -0700]
req:GET /apache_pb.gif HTTP/1.0
status:200
size:2326
referer:http://www.example.com/start.html
ua:Mozilla/4.08 [en] (Win98; I ;Nav)
以下の様なXMLフォーマットされた出力を得ることができます。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<row>
<host>127.0.0.1</host>
<user>frank</user>
<referer>http://www.example.com/start.html</referer>
<userAgent>Mozilla/4.08 [en] (Win98; I ;Nav)</userAgent>
</row>
</root>
最後に
このようにDataSpiderでは柔軟なマッピングの設定を行うことができますので、専用のアダプタがないフォーマットでも対応出来る可能性があります。
Mapperをつかいこなせば、いままで諦めていたような処理を実現できるかもしれませんね。
もちろん、LTSVのような汎用的なフォーマットの場合、専用のアダプタがあったほうが扱いやすいのは言うまでもありません。
みなさまの反響が大きければ専用のアダプタが実現される可能性が高くなりますので、このブログのコメントやdstnのフォーラムでみなさまのお声をお待ちしております。