univocity-parsersというJavaのライブラリを使って、全銀協フォーマットのような各レコードのフォーマットが異なる固定長データファイルを読み込んでみました。

目次

使用するファイルのフォーマット

全銀協フォーマットをベースに、データ項目を省略したものを使います。

12101000000001                                                                                                          
29999サンプルギンコウ     000サンプルシテン       ウケトリニンンイチ                     0000001001                                          
29999サンプルギンコウ     000サンプルシテン       ウケトリニンンニ                      0000002002                                          
8000002000000003003                                                                                                     
9                                                                                                                       

使用するファイルのフォーマットは以下のとおりです。

ヘッダーレコード

データ項目名桁数
データ区分1
種別コード2
コード区分1
委託者コード10
ダミー106

データレコード

データ項目名桁数
データ区分1
被仕向金融機関番号4
被仕向金融機関名15
被仕向支店番号3
被仕向支店名15
受取人名30
振込金額10
ダミー42

トレーラーレコード

データ項目名桁数
データ区分1
合計件数6
合計金額12
ダミー101

エンドレコード

データ項目名桁数
データ区分1
ダミー119

環境

  • JDK 12 (OpenJDK)
  • Apache Maven 3.6.1
  • univocity-parsers 2.8.1

プロジェクトの作成

Mavenでプロジェクトを作成します。

mvn archetype:generate \
  -DarchetypeArtifactId=maven-archetype-quickstart \
  -DinteractiveMode=false \
  -DgroupId=learning.univocityparsers \
  -DartifactId=univocity-parsers-app

依存関係の追加

pom.xmlを編集し、univocity-parsersを依存関係に追加します。

<dependency>
  <groupId>com.univocity</groupId>
  <artifactId>univocity-parsers</artifactId>
  <version>2.8.1</version>
</dependency>

JDK 12を使うため、pom.xmlに以下のパラメーターを追加します。

<properties>
  <maven.compiler.source>12</maven.compiler.source>
  <maven.compiler.target>12</maven.compiler.target>
</properties>

実行クラスの作成

レコードごとにFixedWidthFieldsのインスタンスを作成し、各データ項目の桁数を追加していきます。金額などゼロパディングされている項目については、ゼロを省いた値を取得するため、FieldAlignment.RIGHT, '0'をパラメーターに追加します。

    FixedWidthFields headerRecordFields = new FixedWidthFields();
    headerRecordFields.addField("データ区分", 1);
    headerRecordFields.addField("種別コード", 2);
    headerRecordFields.addField("コード区分", 1);
    headerRecordFields.addField("委託者コード", 10);
    headerRecordFields.addField("ダミー", 106);

    FixedWidthFields dataRecordFields = new FixedWidthFields();
    dataRecordFields.addField("データ区分", 1);
    dataRecordFields.addField("被仕向金融機関番号", 4);
    dataRecordFields.addField("被仕向金融機関名", 15);
    dataRecordFields.addField("被仕向支店番号", 3);
    dataRecordFields.addField("被仕向支店名", 15);
    dataRecordFields.addField("受取人名", 30);
    dataRecordFields.addField("振込金額", 10, FieldAlignment.RIGHT, '0');
    dataRecordFields.addField("ダミー", 42);

    FixedWidthFields trailerRecordFields = new FixedWidthFields();
    trailerRecordFields.addField("データ区分", 1);
    trailerRecordFields.addField("合計件数", 6, FieldAlignment.RIGHT, '0');
    trailerRecordFields.addField("合計金額", 12, FieldAlignment.RIGHT, '0');
    trailerRecordFields.addField("ダミー", 101);

    FixedWidthFields endRecordFields = new FixedWidthFields();
    endRecordFields.addField("データ区分", 1);
    endRecordFields.addField("ダミー", 119);

FixedWidthParserSettingsのインスタンスを作成し、addFormatForLookaheadメソッドでレコードの種類を示すレコードの1桁目の値と、対応するFixedWidthFieldsのオブジェクトを渡します。

    FixedWidthParserSettings parserSettings = new FixedWidthParserSettings();
    parserSettings.getFormat().setLineSeparator("\n");
    parserSettings.addFormatForLookahead("1", headerRecordFields);
    parserSettings.addFormatForLookahead("2", dataRecordFields);
    parserSettings.addFormatForLookahead("8", trailerRecordFields);
    parserSettings.addFormatForLookahead("9", endRecordFields);

ファイルを読み込みます。

    FixedWidthParser parser = new FixedWidthParser(parserSettings);
    InputStreamReader reader = new InputStreamReader(
      ParseFixedWidthFilesApp.class.getResourceAsStream("/fixed-width-file.txt"), "UTF-8");

    List<String[]> allRows = parser.parseAll(reader);
    allRows.forEach(row -> {
      System.out.println(Arrays.toString(row));
    });

実行結果

指定したフォーマットに従い、データ項目単位で配列に格納されています。

[1, 21, 0, 1000000001, null]
[2, 9999, サンプルギンコウ, 000, サンプルシテン, ウケトリニンンイチ, 1001, null]
[2, 9999, サンプルギンコウ, 000, サンプルシテン, ウケトリニンンニ, 2002, null]
[8, 2, 3003, null]
[9, null]

参考サイト

univocity-parsersの公式サイト