Asakusa FrameworkのDirect I/Oのdirectio.text.tabularのメモ。
AsakusaFW 0.9.1のDirect I/Oで、整形されたテキストファイル(formatted
text、要するにcsvやtsv)を読み書きする機能が追加になった。
すなわち、DMDL上でdirectio.text.tabularおよびdirectio.text.csv属性が使える。
directio.text.csvと従来のdirectio.csvとの違いは、directio.text.csvの方が汎用的(機能が豊富)であるということ。
directio.text.csvだとエスケープ文字やNULL/空文字列の扱いや余分な項目(カラム数が可変(不定)のcsv)をどうするか等、色々と指定できる。ただしその分、実行速度はdirectio.csvより若干劣る。
なので、csvファイルを扱うのであれば、基本的にはdirectio.csvを用いることを考え、機能が必要ならdirectio.text.csvを使用するのが良さそう。
directio.text.csvとdirectio.text.tabularの違いは、細かい設定を省略したときのデフォルト値が
directio.text.csvはcsv用(カンマ区切り)
directio.text.tabularはtsv用(タブ区切り)
であることくらいで、機能は同じ。
(なので、directio.text.csvで区切り文字をタブにすればタブ区切りに出来るけど、紛らわしいのでやらない方がいいと思う^^;)
directio.text.csvの例。
CSVファイルを読み書きする為のデータモデルを用意する。
データモデル名は何でもよいが、directio.text.csv属性を付ける。
@directio.text.csv
example = {
"カラム1"
column1 : TEXT;
"カラム2"
column2 : INT;
};
これでDMDLのコンパイルを行うと、「Abstractモデル名CsvTextInputDescription」「Abstractモデル名CsvTextOutputDescription」といったImporter/Exporterの抽象クラスが作られる。
(directio.text.tabularの場合は、「Abstractモデル名TabularTextInputDescription」「Abstractモデル名TabularTextOutputDescription」)
生成されたImporter/Exporterの抽象クラスを継承し、具象クラスを作成する。
Importerの例 | Exporterの例 |
---|---|
public class ExampleFromCsv extends
AbstractExampleCsvTextInputDescription { |
public class ExampleToCsv extends
AbstractExampleCsvTextOutputDescription { |
DMDLのデータモデルに記述するdirectio.text.csvやdirectio.text.tabular属性には、色々な引数を指定することが出来る。
→Asakusa Framework documentationのデータフォーマットの設定
なお、directio.csvとは、同じようなことを設定する場合でも設定名や設定値が異なっているものがあるので注意。
(例えばdirectio.csvのtrueは、directio.text.csv/tabularではtrue_format)
(例えばdirectio.csvのhas_headerはTRUE/FALSEだが、directio.text.csv/tabularのheaderはnothing/force/skip/auto)
要素 | 説明 | 例 |
---|---|---|
charset |
ファイルのエンコーディング。デフォルトはUTF-8。 | @directio.text.csv(charset = "MS932") |
line_separator |
行区切り文字。 デフォルトは、csvの場合はwindows(CRLF)、tabularの場合はunix(LF) |
@directio.text.tabular(line_separator = unix) |
field_separator |
フィールド(項目)の区切り文字。 デフォルトは、csvの場合はカンマ、tabularの場合はタブ。 |
@directio.text.tabular(field_separator = "\t") |
on_more_input |
データモデルで定義されているより実際のデータのフィールド(項目)が多い場合の動作。 デフォルトはerror。ignore(またはreport)にすると、余分なフィールドは無視する。 |
@directio.text.csv(on_more_input = ignore) |
on_less_input |
データモデルで定義されているより実際のデータのフィールド(項目)が少ない場合の動作。 デフォルトはerror。ignore(またはreport)にすると、足りないフィールドにはNULLが設定される。 |
@directio.text.csv(on_less_input = ignore) |
allow_linefeed |
ファイルを読み込むとき、各フィールドのデータに改行(LF)が入っていても読めるようにするかどうか。 デフォルトはfalse。データに改行が入っているとエラーになる。 trueにすると改行が入っていても読み込まれるようになる。ただし入力データの分割が行われなくなる。 |
@directio.text.csv(allow_linefeed = true) |
DMDLのデータモデル内の各プロパティーにdirectio.text.csv/directio.text.tabular関連の属性を指定することが出来る。
属性 | 説明 | 例 |
---|---|---|
@directio.text.field |
各フィールド(データモデルのプロパティー)の設定。 | @directio.text.field(name = "title") |
@directio.text.file_name |
この属性が付けられたプロパティーには(ファイルのフィールドのデータではなく)ファイル名 (スキーマ付きのフルパス)が入る。 | @directio.text.file_name |
@directio.text.line_number |
この属性が付けられたプロパティーには(ファイルのフィールドのデータではなく)テキスト行番号が入る。 これを指定すると、入力データの分割が行われなくなる。 →line_numberとrecord_numberの違いは、directio.csvと同じ |
@directio.text.line_number |
@directio.text.record_number |
この属性が付けられたプロパティーには(CSVファイルのフィールドのデータではなく)レコード番号が入る。 これを指定すると、入力データの分割が行われなくなる。 →line_numberとrecord_numberの違いは、directio.csvと同じ |
@directio.text.record_number |