S-JIS[2017-04-30] 変更履歴

Asakusa Framework Direct I/O 整形テキストファイル連携

Asakusa FrameworkDirect 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の例。

DMDLの記述

CSVファイルを読み書きする為のデータモデルを用意する。

データモデル名は何でもよいが、directio.text.csv属性を付ける。

src/main/dmdl/example.dmdl:

@directio.text.csv
example = {

    "カラム1"
    column1 : TEXT;

    "カラム2"
    column2 : INT;
};

DMDLのコンパイル

これでDMDLのコンパイルを行うと、「Abstractモデル名CsvTextInputDescription」「Abstractモデル名CsvTextOutputDescription」といったImporter/Exporterの抽象クラスが作られる。

(directio.text.tabularの場合は、「Abstractモデル名TabularTextInputDescription」「Abstractモデル名TabularTextOutputDescription」)


Importer/Exporterクラスの記述

生成されたImporter/Exporterの抽象クラスを継承し、具象クラスを作成する。

Importerの例 Exporterの例
public class ExampleFromCsv extends AbstractExampleCsvTextInputDescription {

    @Override
    public String getBasePath() {
        return "example";
    }

    @Override
    public String getResourcePattern() {
        return "*.csv";
    }

    @Override
    public DataSize getDataSize() {
        return DataSize.LARGE;
    }
}
public class ExampleToCsv extends AbstractExampleCsvTextOutputDescription {

    @Override
    public String getBasePath() {
        return "example";
    }

    @Override
    public String getResourcePattern() {
        return "*.csv";
    }

    @Override
    public List<String> getDeletePatterns() {
        return Arrays.asList("*.csv");
    }
}

ベースパスとリソースパターンの使い分け


directio.text.csv/directio.text.tabular属性

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)

directio.text.csv/directio.text.tabular属性に指定できる主な要素
要素 説明
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)

directio.text.*属性

DMDLのデータモデル内の各プロパティーにdirectio.text.csv/directio.text.tabular関連の属性を指定することが出来る。

属性 説明
@directio.text.field 各フィールド(データモデルのプロパティー)の設定。 @directio.text.field(name = "title")
book_title: TEXT;
@directio.text.file_name この属性が付けられたプロパティーには(ファイルのフィールドのデータではなく)ファイル名 (スキーマ付きのフルパス)が入る。 @directio.text.file_name
file_name : TEXT;
@directio.text.line_number この属性が付けられたプロパティーには(ファイルのフィールドのデータではなく)テキスト行番号が入る。
これを指定すると、入力データの分割が行われなくなる。
→line_numberとrecord_numberの違いは、directio.csvと同じ
@directio.text.line_number
line_number : LONG;
@directio.text.record_number この属性が付けられたプロパティーには(CSVファイルのフィールドのデータではなく)レコード番号が入る。
これを指定すると、入力データの分割が行われなくなる。
→line_numberとrecord_numberの違いは、directio.csvと同じ
@directio.text.record_number
record_number : LONG;

Direct I/Oへ戻る / AsakusaFW目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま