ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

Excelファイル処理:Embulk→AsakusaFW

2015-10-18 23:58:51 | PG(分散処理)

ここ最近、Embulkプラグインの作成、というかExcelファイル操作(Apache POI)のプログラミングばっかりやってた^^;

そもそもの動機としては、Asakusa FrameworkWindGate JDBCではRDBからの大量データの読み込みに適さないので、それに代わる転送ツールとしてEmbulkを試し始めたもの。
(WindGate JDBCはポータブルなので、AsakusaFWが使う形式でのRDB入出力のコーディングは楽だが、大量データには適していない)

ついでに、ExcelファイルをCSVファイルに変換する要件にもEmbulkが良さそうだと思った。
Hiroyuki SatoさんがRubyのrooを使ってExcelファイルを読み込むプラグイン(embulk-parser-roo-excel)を公開されていらしたけど、これはxlsxしか対応していないようだったし、Embulkプラグインの勉強を兼ねて、Apache POIを使ったプラグイン(embulk-parser-poi_excel)を作ってみた。
作り出したらちょっと面白くなっちゃって、セルのスタイルの取得とか、普通なら使わないであろう機能まで作りこんでしまった^^;
(ちなみにHiroyuki Satoさんのプラグイン名が「roo-excel」だったので、こちらは「poi-excel」にすればいいや、とすぐ決まった(笑) ただ、今のEmbulkプラグインでは、プロジェクト作成時に「poi-excel」(ハイフン区切り)を指定したのに、作られたのは「poi_excel」(アンダースコア区切り)だったorz)

Excelファイルを読み込むプラグインを作ったところで、今度は逆にExcelファイルを出力するプラグインがあると面白いかなーと思って、試しに作ってみた。(embulk-formatter-poi_excel
しかしEmbulkはデータを分散してバルク転送するツールなので、入出力プラグインに従ってファイル自体が分割されることもあるし、ファイル名も001.00みたいなIDが付く。仮に1つのファイルにまとめることが出来たとしても、データの並び順なんかは指定できないと思う。
つまり、Excelファイル形式で出力するのは、Embulkを使う要件からは外れているような気がする。

一方、AsakusaFWなら、ファイル名は出力時に指定できるし、1つのファイルにまとめることも出来る(逆にデータに従って分割することも出来る)し、データの並び順も指定できる。
そもそもExcelファイルに出力したいなら何らかのデータ加工をした結果のはずで、データの加工ならAsakusaFWの分野だし。
という訳で、AsakusaFWでExcelを出力するExporter(Formatクラス)を作ってみた。
Formatクラスは素直なJavaのクラスなので、やろうと思えばPOIの機能を使って、シートの追加削除でもセルの修飾でも出来るし。 
(ただし、AsakusaFWは大量データを扱うバッチアプリケーションを作成するフレームワークなので、ただ単にExcelに出力したいだけなら本来の目的とは全然一致してないばかりか、実行環境を用意するのが大変すぎるけど(苦笑))

そして、作りながら思い出したんだけど、AsakusaFWのFormatクラスは、入力と出力をペアで作る必要がある。
なので、Excelファイルを読み込む機能も出来上がることになった。
しかし、入出力をペアにするという制限上、embulk-parser-poi_excelのような「セルのスタイル等を取得する機能」は入れられない。つまり、Excelファイル入力としてはembulk-parser-poi_excelの方が機能が上。


結論として、Excelファイルを読み込んでCSVファイルに変換するのはEmbulk。
データを加工してExcelファイルに出力するならAsakusaFW。
という分担が良いような気がするんだけど、どうでっしゃろ?



最新の画像もっと見る

コメントを投稿