LoginSignup
1
0

ASTERIA Warp 固定長について考える①

Last updated at Posted at 2024-02-17

はじめに

ASTERIA Warpでは固定長データを扱えるわけですが出現頻度が稀な上にファイルレイアウトにマルチフォーマットが用いられている事もありむつかしそうな感じがします。固定長の代表格の全銀協フォーマットの様に繰り返し構造のないものであれば単純なフローで実装できますので簡単なサンプルとともに説明します。今回もメモリ内で処理を行いループは行わない構築です。

全銀協フォーマット(振込)

全銀協パーソナル・コンピュータ用標準通信プロトコル(ベーシック手順)-適用業務およびレコード・フォーマット-
こちらの総合振込レコード・フォーマットを対象とします。
サンプルデータは以下を利用します。

振込データ.csv
顧客コード,銀行コード,銀行名,支店コード,支店名,預金種目,口座番号,受取人名,振込金額
101,1234,サンプルギンコウエー,1001,サンプルシテンエー,普通,1234567,サンプルジョウヘイ,5000
102,5678,サンプルギンコウビー,2002,サンプルシテンビー,当座,7654321,サンプルナオミ,8000
103,9012,サンプルギンコウシー,3003,サンプルシテンシー,普通1,9876543,サンプルユウキ,12000
104,3456,サンプルギンコウディー,4004,サンプルシテンディー,当座2,2345678,サンプルマイ,15000
105,7890,サンプルギンコウイー,5005,サンプルシテンイー,普通1,8765432,サンプルアヤ,20000
106,2345,サンプルギンコウエフ,6006,サンプルシテンエフ,当座2,3456789,サンプルトモ,25000
107,6789,サンプルギンコウジー,7007,サンプルシテンジー,普通1,6543210,サンプルナツ,30000
108,1234,サンプルギンコウエー,1001,サンプルシテンエー,普通1,1234567,サンプルユウキ,35000
109,5678,サンプルギンコウビー,2002,サンプルシテンビー,当座2,7654321,サンプルヒロ,40000
110,9012,サンプルギンコウシー,3003,サンプルシテンシー,普通1,9876543,サンプルマナ,45000
111,3456,サンプルギンコウディー,4004,サンプルシテンディー,普通2,2345678,サンプルアツシ,50000
112,7890,サンプルギンコウイー,5005,サンプルシテンイー,当座1,8765432,サンプルミキ,55000
113,2345,サンプルギンコウエフ,6006,サンプルシテンエフ,普通2,3456789,サンプルエリカ,60000
114,6789,サンプルギンコウジー,7007,サンプルシテンジー,普通1,6543210,サンプルヨウスケ,65000
115,1234,サンプルギンコウエー,1001,サンプルシテンエー,当座1,1234567,サンプルアイ,70000
116,5678,サンプルギンコウビー,2002,サンプルシテンビー,普通2,7654321,サンプルナナ,75000
117,9012,サンプルギンコウシー,3003,サンプルシテンシー,普通1,9876543,サンプルミサ,80000
118,3456,サンプルギンコウディー,4004,サンプルシテンディー,普通2,2345678,サンプルトモ,85000
119,7890,サンプルギンコウイー,5005,サンプルシテンイー,普通1,8765432,サンプルユウキ,90000

出力ファイル
image.png

処理フロー

9-Flow.jpg

フロー変数

フロー変数 データ型 初期値
c依頼人コード String 1234567890
c依頼人名 String カ)コテイチヨウサンプル
c仕向金融機関番号 String 9999
c仕向金融機関名 String イライギンコウ
c仕向支店番号 String 999
c仕向支店名 String イライシテン
c依頼人預金種目 String 1
c依頼人口座番号 String 1122334

【処理概要】

  1. ヘッダーレコードのファイル出力(新規)
  2. 変換元ファイルを読み込みデータレコードのファイル出力(追加)
  3. トレーラレコードのファイル出力(追加)
  4. エンドレコードのファイル出力(追加)

この処理ではループは行わず、同一ファイル名で、ヘッダー、データ、トレーラ、エンドの順で書き込みます。ファイル書き込みを1度で行う方法もありますが、そちらは後で説明します。取得したCSVはデータレコードで金額の集計を行いストリーム変数としてストリームに付属させ、トレーラレコードではその金額を使用します。

固定長のフォーマットは以下の様に指定します。

プロパティ名
ストリーム型 FixedLength
読み込み開始行 1
フィールド数 13
出力エンコーディング shift_jis
レコード区切り レコード長
レコード長 120

通常Windowsで扱うshift-jisはWindows-31J (MS932)で扱いますが固定長で明確な記載がない場合は、shift-jisを指定します。また、固定長のみebcdicを指定する事ができますが、汎用機固有のEBSDICを利用する場合は出力エンコーディングに直接入力して指定します。
フローで文字コード EBCDICおよびEBCDIKを扱うことはできますか?

Mapper(ヘッダーレコード)

ヘッダーの依頼人情報はフロー変数からの移送を行っています。レコード区分は1(ヘッダ)、振込指定日は処理日をMMddで出力しています。

9-Mapper25jpg.jpg

レイヤー

レイヤー名 レイヤー条件
移送 なし

固定長レコード(ヘッダーレコード)

フィールド名 データ型 開始位置 長さ 小数点位置
データ区分 String 0 1 0
種別コード String 1 2 0
コード区分 String 3 1 0
依頼人コード String 4 10 0
依頼人名 String 14 40 0
振込指定日 String 54 4 0
仕向金融機関番号 String 58 4 0
仕向金融機関名 String 62 15 0
仕向支店番号 String 77 3 0
仕向支店名 String 80 15 0
預金種目(依頼人) String 95 1 0
口座番号(依頼人) String 96 7 0
空きエリア String 103 17 0

FileOutput(ヘッダ)

ファイルパスは”output/振込データ.txt”、書き込み処理を”新規”で指定します。

Mapper(データレコード)

このマッパーでは、読み込まれたCSVをデータレコードに移送します。レイヤーは2つ使用していますが見やすさのために分けているので1つでも構いません。また、トレーラで使用する振込額の集計をマッパー変数で集計しています。同じくトレーラで使用する件数はこのマッパーで出力されるレコード件数ですのでカウントは行いません。振込額が0の行を除くのであれば条件レイヤーを使用し行を移送しないようにします。
変換レイヤーでは、預金種目のコード変換、全角カナ文字の小文字の大文字可(ャ→ヤなど)と半角カナに変換し文字のカットを行っています。振込金額は0埋めしています。

9-Mapper7.jpg

小文字変換

ァ=ア
ィ=イ
ゥ=ウ
ェ=エ
ォ=オ
ャ=ヤ
ュ=ユ
ョ=ヨ
ヲ=オ

マッパー変数

マッパー変数 データ型 初期値 ストリーム変数
振込合計 Decimal 0 はい

レイヤー

レイヤー名 レイヤー条件
移送 なし
変換 なし

固定長レコード(データレコード)

フィールド名 データ型 開始位置 長さ 小数点位置
データ区分 String 0 1 0
被仕向金融機関番号 String 1 4 0
被仕向金融機関名 String 5 15 0
被仕向支店番号 String 20 3 0
被仕向支店名 String 23 15 0
手形交換所番号 String 38 4 0
預金種目 String 42 1 0
口座番号 String 43 7 0
受取人名 String 50 30 0
振込金額 String 80 10 0
新規コード String 90 1 0
顧客コード1 String 91 10 0
顧客コード2 String 101 10 0
振込指定区分 String 111 1 0
識別表示 String 112 1 0
空きエリア String 113 7 0

FileOutput(データ)

ファイルパスはヘッダと同じ”output/振込データ.txt”、書き込み処理を”追加”で指定します。

Mapper(トレーラレコード)

直前のFilePutの出力ストリームは、入力ストリームをそのまま出力します。そのためここではストリームにストリーム変数として登録されてる「振込合計」を合計金額、ストリームのレコード件数を合計件数として利用します。
9-Mapper8.jpg

レイヤー

レイヤー名 レイヤー条件
移送 なし

固定長レコード(トレーラレコード)

フィールド名 データ型 開始位置 長さ 小数点位置
データ区分 String 0 1 0
合計件数 String 1 6 0
合計金額 String 7 12 0
ダミー String 19 101 0

Mapper(エンドレコード)

エンドレコードではレコード区分のみ指定します
9-Mapper9.jpg

レイヤー

レイヤー名 レイヤー条件
移送 なし

固定長レコード(エンドレコード)

フィールド名 データ型 開始位置 長さ 小数点位置
データ区分 String 0 1 0
空きエリア String 1 119 0

レコードをまとめてファイル出力する場合

今回のケースでは必要ないですが、ストリームをまとめてファイルの出力として1度で出力する場合、ストリームの合成が必要になります。

処理フロー

使用データ、フロー変数などは先ほどのものと変わりません。合成を行うためファイルに出力する変わりにConvertでストリームをバイナリ型に変換しています。その後Mapper内でストリームの結合をし、それをファイル出力します。

10-Flow.jpg

【処理概要】

  1. ヘッダーレコードの成形しバイナリ型に変換
  2. 変換元ファイルを読み込みデータレコードの成形しバイナリ型に変換
  3. トレーラレコードの成形しバイナリ型に変換
  4. エンドレコードの成形しバイナリ型に変換
  5. バイナリを結合しファイル出力する

Mapper(ストリーム結合)

4つのストリームをConcatenateBでヘッダー、データ、トレーラ、エンドの順で結合し1つのバイナリストリームにします。

image.png

複数の入力のあるMapperで「イメージをファイルに保存」しても線が全部出力されないで2406で修正されるとよいですね・・

レイヤー

レイヤー名 レイヤー条件
移送 なし

固定長ファイルの確認用処理

今回の様に、Shift-Jisで出力すれば、テキストエディタで表示する事で中身は確認できます。しかし、データが正しいカラムに移送されているかはそのままではわかりません。エンコードがEBCDICであればなおさらです。固定長の様にデータ内容とカラムの情報直接視認できない形式では、出力結果の確認用の逆変換のCSV化処理を作ると良いでしょう。出力で使用したストリーム定義を利用しますがそのままではマルチフォーマットで確認できないため、確認用の定義は別形式のカラム定義を行います。このフローでは固定長フォーマットを読み込み、それをCSV形式に変換します。

処理フロー

11-Flow.jpg

【処理概要】

  1. 固定長ファイルの読み込み
  2. ヘッダレコードのみをフィルタしCSVにし、テキストストリームに変換する
  3. データレコードのみをフィルタしCSVにし、テキストストリームに変換する
  4. トレーラレコードのみをフィルタしCSVにし、テキストストリームに変換する
  5. エンドレコードのみをフィルタしCSVにし、テキストストリームに変換する
  6. テキストファイルを結合し、ファイル出力する

FilleGet

ASTERIA WarpのFixedLengthは重複定義が許されるという特徴があります。これは、COBOLのREDEFINES句の再定義に近い機能です。ただし、カラムに数値を含まない前提での実装となります。パック10進、ゾーン10進を含まないデータであれば、数値であっても表面上は文字として扱っても問題ないため、ここではすべて文字として定義します。
振込データの形式は、1バイト目のデータ区分以外は各レコード異なっています。そのため、データ区分のみを共通フィールドとし、それぞれのレコードカラムをそのままの多重定義します。同一名称カラムが登録できないため、先頭にデータ区分をつけたカラムとします。こうした場合、120バイトのデータは、どのレコード形式の行であっても、すべてのカラムに同じ様に値が格納されます。

固定長レコード(エンドレコード)

フィールド名 データ型 開始位置 長さ 小数点位置
データ区分 String 0 1 0
1_種別コード String 1 2 0
1_コード区分 String 3 1 0
1_依頼人コード String 4 10 0
1_依頼人名 String 14 40 0
1_振込指定日 String 54 4 0
1_仕向金融機関番号 String 58 4 0
1_仕向金融機関名 String 62 15 0
1_仕向支店番号 String 77 3 0
1_仕向支店名 String 80 15 0
1_預金種目(依頼人) String 95 1 0
1_口座番号(依頼人) String 96 7 0
1_空きエリア String 103 17 0
2_被仕向金融機関番号 String 1 4 0
2_被仕向金融機関名 String 5 15 0
2_被仕向支店番号 String 20 3 0
2_被仕向支店名 String 23 15 0
2_手形交換所番号 String 38 4 0
2_預金種目 String 42 1 0
2_口座番号 String 43 7 0
2_受取人名 String 50 30 0
2_振込金額 String 80 10 0
2_新規コード String 90 1 0
2_顧客コード1 String 91 10 0
2_顧客コード2 String 101 10 0
2_振込指定区分 String 111 1 0
2_識別表示 String 112 1 0
2_空きエリア String 113 7 0
8_合計件数 String 1 6 0
8_合計金額 String 7 12 0
8_ダミー String 19 101 0
9_空きエリア String 1 119 0

Mapper(ヘッダーレコード)

このマッパーではデータ区分が1のもののみを出力するMapperです。
各CSVストリームの基本設定は同一で出力時にヘッダーを出力する設定にします。データ区分のカラム名はそのままではなくデータ区分の値"1"を指定しています。
移送するカラムは、データ区分1のカラムである”1_”のカラムを移送します。

11-Mapper1.jpg

レイヤー

レイヤー名 レイヤー条件
移送 $record.データ区分 = "1"

固定長レコード(データレコード)

フィールド名 データ型
1 String
種別コード String
コード区分 String
依頼人コード String
依頼人名 String
振込指定日 String
仕向金融機関番号 String
仕向金融機関名 String
仕向支店番号 String
仕向支店名 String
預金種目(依頼人) String
口座番号(依頼人) String
空きエリア String

Mapper(データレコード)

このマッパーではデータ区分が2のもののみを出力するMapperです。

11-Mapper2.jpg

レイヤー

レイヤー名 レイヤー条件
移送 $record.データ区分 = "2"

固定長レコード(データレコード)

フィールド名 データ型
2 String
被仕向金融機関番号 String
被仕向金融機関名 String
被仕向支店番号 String
被仕向支店名 String
手形交換所番号 String
預金種目 String
口座番号 String
受取人名 String
振込金額 String
新規コード String
顧客コード1 String
顧客コード2 String
振込指定区分 String
識別表示 String
空きエリア String

Mapper(トレーラレコード)

このマッパーではデータ区分が8のもののみを出力するMapperです。

11-Mapper3.jpg

レイヤー

レイヤー名 レイヤー条件
移送 $record.データ区分 = "8"

固定長レコード(データレコード)

フィールド名 データ型
合計件数 String
合計金額 String
ダミー String

Mapper(エンドレコード)

このマッパーではデータ区分が9のもののみを出力するMapperです。エンドは確認が必要が無ければ出力しなくても問題ないと思います。

11-Mapper4.jpg

レイヤー

レイヤー名 レイヤー条件
移送 $record.データ区分 = "9"

固定長レコード(データレコード)

フィールド名 データ型
9 String
空きエリア String

Mapper(結合)

CSVのストリームはConvertでテキスト型に変換する事で、行ではなくヘッダも含めたオブジェクトとして扱われます。CSV型の場合レコードとして判定されるためこの様な結合は行えませんが(レコード毎に結合されてしまう)オブジェクトではそのストリームをそのまま結合する事でストリームを合成する事が出来ます。そのストリームをファイル出力する事で、各ヘッダを含んだCSVの合成されたテキストファイルになります。

image.png

"1","種別コード","コード区分","依頼人コード","依頼人名","振込指定日","仕向金融機関番号","仕向金融機関名","仕向支店番号","仕向支店名","預金種目(依頼人)","口座番号(依頼人)","空きエリア"
"1","21","0","1234567890","カ)コテイチヨウサンプル                           ","0218","9999","イライギンコウ       ","999","イライシテン         ","1","1122334","                 "
"2","被仕向金融機関番号","被仕向金融機関名","被仕向支店番号","被仕向支店名","手形交換所番号","預金種目","口座番号","受取人名","振込金額","新規コード","顧客コード1","顧客コード2","振込指定区分","識別表示","空きエリア"
"2","1234","サンプルギンコウエー   ","100","サンプルシテンエー     ","    ","1","1234567","サンプルジヨウヘイ                   ","0000005000","1","101       ","          "," "," ","       "
"2","5678","サンプルギンコウビー  ","200","サンプルシテンビー    ","    ","2","7654321","サンプルナオミ                      ","0000008000","1","102       ","          "," "," ","       "
"2","9012","サンプルギンコウシー   ","300","サンプルシテンシー     ","    ","9","9876543","サンプルユウキ                      ","0000012000","1","103       ","          "," "," ","       "
"2","3456","サンプルギンコウデイー ","400","サンプルシテンデイー   ","    ","9","2345678","サンプルマイ                       ","0000015000","1","104       ","          "," "," ","       "
"2","7890","サンプルギンコウイー   ","500","サンプルシテンイー     ","    ","9","8765432","サンプルアヤ                       ","0000020000","1","105       ","          "," "," ","       "
"2","2345","サンプルギンコウエフ   ","600","サンプルシテンエフ     ","    ","9","3456789","サンプルトモ                       ","0000025000","1","106       ","          "," "," ","       "
"2","6789","サンプルギンコウジー  ","700","サンプルシテンジー    ","    ","9","6543210","サンプルナツ                       ","0000030000","1","107       ","          "," "," ","       "
"2","1234","サンプルギンコウエー   ","100","サンプルシテンエー     ","    ","9","1234567","サンプルユウキ                      ","0000035000","1","108       ","          "," "," ","       "
"2","5678","サンプルギンコウビー  ","200","サンプルシテンビー    ","    ","9","7654321","サンプルヒロ                       ","0000040000","1","109       ","          "," "," ","       "
"2","9012","サンプルギンコウシー   ","300","サンプルシテンシー     ","    ","9","9876543","サンプルマナ                       ","0000045000","1","110       ","          "," "," ","       "
"2","3456","サンプルギンコウデイー ","400","サンプルシテンデイー   ","    ","9","2345678","サンプルアツシ                      ","0000050000","1","111       ","          "," "," ","       "
"2","7890","サンプルギンコウイー   ","500","サンプルシテンイー     ","    ","9","8765432","サンプルミキ                       ","0000055000","1","112       ","          "," "," ","       "
"2","2345","サンプルギンコウエフ   ","600","サンプルシテンエフ     ","    ","9","3456789","サンプルエリカ                      ","0000060000","1","113       ","          "," "," ","       "
"2","6789","サンプルギンコウジー  ","700","サンプルシテンジー    ","    ","9","6543210","サンプルヨウスケ                     ","0000065000","1","114       ","          "," "," ","       "
"2","1234","サンプルギンコウエー   ","100","サンプルシテンエー     ","    ","9","1234567","サンプルアイ                       ","0000070000","1","115       ","          "," "," ","       "
"2","5678","サンプルギンコウビー  ","200","サンプルシテンビー    ","    ","9","7654321","サンプルナナ                       ","0000075000","1","116       ","          "," "," ","       "
"2","9012","サンプルギンコウシー   ","300","サンプルシテンシー     ","    ","9","9876543","サンプルミサ                       ","0000080000","1","117       ","          "," "," ","       "
"2","3456","サンプルギンコウデイー ","400","サンプルシテンデイー   ","    ","9","2345678","サンプルトモ                       ","0000085000","1","118       ","          "," "," ","       "
"2","7890","サンプルギンコウイー   ","500","サンプルシテンイー     ","    ","9","8765432","サンプルユウキ                      ","0000090000","1","119       ","          "," "," ","       "
"8","合計件数 ","合計金額 ","ダミー"
"8","000019","000000865000","                                                                                                     "
"9","空きエリア"
"9","                                                                                                                       "

最後に

 固定長はシーケンシャル媒体を利用しなくなった今でも根深く残っている形式なだけに、ASTERIA Warpなどの変換でいまだに出現する形式です。今回は最も単純な変換として全銀協のフォーマットで説明を行いました。次は伝票形式の固定長について扱ってみたいと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0