[AsakusaFW] Asakusa Framework のファイル入出力についてあれこれ

開発の流れ — Asakusa Framework 0.10.2 documentation に、

WindGateは逆に「ポータブルなデータ転送ツール」を目指したもので、 さまざまなRDBMSやローカルファイルシステム上のフラットファイルなどを利用できますが、 特定環境向けの最適化を行っておらず、

とあります。

この辺りについて一通り調べて、分かったことをまとめます。
なお、本エントリは Asakusa Framework 0.2.6 についての記述となりますので、ご了承ください。

a. サポートされている(と言っていい)ファイル形式

CSVファイルについては、Asakusa DSLスタートガイド — Asakusa Framework 0.10.2 documentation にある通り定義すれば、mvn compile で必要なクラス一式を自動生成してくれてかなり快適。しかし、これ以外のフォーマットはそれなりにコードを書くことが求められます。

b. サポートされていないファイル形式を扱うには?

一つの方法は、こちら→AsakusaFW BinaryStreamFormatメモ(Hishidama's Asakusa Framework BinaryStreamFormat Memo)


もう一つは、自動生成を極力利用する方法。DMDL定義で DataModel, ModelInput, ModelOutput までは生成してくれるので、あと必要な・・・

  • 1. ModelInput につっこんであげるための Parser (RecordParser を implements)
  • 2. ModelOutput につっこんであげるための Emitter (RecordEmitter を implements)
  • 3. FsExporterDescription/FsImporterDescription で返してあげるための DataModelStreamSupport を implements したクラス

を用意してあげれば、ジョブフローのIn/Outとして利用できるようになります。
しかし、この、自動生成される ModelInput/ModelOutput が、連続してfill/emitメソッドを呼び出すことでファイル入出力を行うという、いかにもCSVを想定したコードになっているため、固定長レコードのファイルには流用できません。結局、自分で書かなければならないという状態です。
ちなみに、aのほうで"(tsv)"としたのは、TsvParser/TsvEmitter なるクラスが用意されていて、この、自動生成されたModelImput/ModelOutput に突っ込んであげればそのまま動きそうだったから(試してはいません)。


というわけで、仕事で使うのであれば『入出力形式はCSVで統一する』か、『がんばってコードを書く』かしないといけない(既存システムとの連携だとこちらからファイル形式を指定できないケースも多々あるよね〜)という状況でした!というのが本日の結論。

追記(2012/08/12)

固定長うんぬんはさておき、単純なファイル入出力であれば、FileImporterDescription/FileExporterDescription を使えばOKというのを知った。サンプルはこちら→https://github.com/asakusafw/asakusafw-examples/tree/master/example-direct
あと、「ImporterとExporterは対で用意しなければならないというのは自分の勘違い」「@JobFlowと@FlowPartの違い」など分からなかったことがいくつか分かりましたよ、と。