はじめに
ASTERIA Warpでは固定長データを扱えるわけですが出現頻度が稀な上にファイルレイアウトにマルチフォーマットが用いられている事もありむつかしそうな感じがします。固定長の代表格の全銀協フォーマットの様に繰り返し構造のないものであれば単純なフローで実装できますので簡単なサンプルとともに説明します。今回もメモリ内で処理を行いループは行わない構築です。
全銀協フォーマット(振込)
全銀協パーソナル・コンピュータ用標準通信プロトコル(ベーシック手順)-適用業務およびレコード・フォーマット-
こちらの総合振込レコード・フォーマットを対象とします。
サンプルデータは以下を利用します。
顧客コード,銀行コード,銀行名,支店コード,支店名,預金種目,口座番号,受取人名,振込金額
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
処理フロー
フロー変数
フロー変数 | データ型 | 初期値 |
---|---|---|
c依頼人コード | String | 1234567890 |
c依頼人名 | String | カ)コテイチヨウサンプル |
c仕向金融機関番号 | String | 9999 |
c仕向金融機関名 | String | イライギンコウ |
c仕向支店番号 | String | 999 |
c仕向支店名 | String | イライシテン |
c依頼人預金種目 | String | 1 |
c依頼人口座番号 | String | 1122334 |
【処理概要】
- ヘッダーレコードのファイル出力(新規)
- 変換元ファイルを読み込みデータレコードのファイル出力(追加)
- トレーラレコードのファイル出力(追加)
- エンドレコードのファイル出力(追加)
この処理ではループは行わず、同一ファイル名で、ヘッダー、データ、トレーラ、エンドの順で書き込みます。ファイル書き込みを1度で行う方法もありますが、そちらは後で説明します。取得したCSVはデータレコードで金額の集計を行いストリーム変数としてストリームに付属させ、トレーラレコードではその金額を使用します。
固定長のフォーマットは以下の様に指定します。
プロパティ名 | 値 |
---|---|
ストリーム型 | FixedLength |
読み込み開始行 | 1 |
フィールド数 | 13 |
出力エンコーディング | shift_jis |
レコード区切り | レコード長 |
レコード長 | 120 |
通常Windowsで扱うshift-jisはWindows-31J (MS932)で扱いますが固定長で明確な記載がない場合は、shift-jisを指定します。また、固定長のみebcdicを指定する事ができますが、汎用機固有のEBSDICを利用する場合は出力エンコーディングに直接入力して指定します。
フローで文字コード EBCDICおよびEBCDIKを扱うことはできますか?
Mapper(ヘッダーレコード)
ヘッダーの依頼人情報はフロー変数からの移送を行っています。レコード区分は1(ヘッダ)、振込指定日は処理日をMMddで出力しています。
レイヤー
レイヤー名 | レイヤー条件 |
---|---|
移送 | なし |
固定長レコード(ヘッダーレコード)
フィールド名 | データ型 | 開始位置 | 長さ | 小数点位置 |
---|---|---|---|---|
データ区分 | 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埋めしています。
小文字変換
ァ=ア
ィ=イ
ゥ=ウ
ェ=エ
ォ=オ
ャ=ヤ
ュ=ユ
ョ=ヨ
ヲ=オ
マッパー変数
マッパー変数 | データ型 | 初期値 | ストリーム変数 |
---|---|---|---|
振込合計 | 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の出力ストリームは、入力ストリームをそのまま出力します。そのためここではストリームにストリーム変数として登録されてる「振込合計」を合計金額、ストリームのレコード件数を合計件数として利用します。
レイヤー
レイヤー名 | レイヤー条件 |
---|---|
移送 | なし |
固定長レコード(トレーラレコード)
フィールド名 | データ型 | 開始位置 | 長さ | 小数点位置 |
---|---|---|---|---|
データ区分 | String | 0 | 1 | 0 |
合計件数 | String | 1 | 6 | 0 |
合計金額 | String | 7 | 12 | 0 |
ダミー | String | 19 | 101 | 0 |
Mapper(エンドレコード)
レイヤー
レイヤー名 | レイヤー条件 |
---|---|
移送 | なし |
固定長レコード(エンドレコード)
フィールド名 | データ型 | 開始位置 | 長さ | 小数点位置 |
---|---|---|---|---|
データ区分 | String | 0 | 1 | 0 |
空きエリア | String | 1 | 119 | 0 |
レコードをまとめてファイル出力する場合
今回のケースでは必要ないですが、ストリームをまとめてファイルの出力として1度で出力する場合、ストリームの合成が必要になります。
処理フロー
使用データ、フロー変数などは先ほどのものと変わりません。合成を行うためファイルに出力する変わりにConvertでストリームをバイナリ型に変換しています。その後Mapper内でストリームの結合をし、それをファイル出力します。
【処理概要】
- ヘッダーレコードの成形しバイナリ型に変換
- 変換元ファイルを読み込みデータレコードの成形しバイナリ型に変換
- トレーラレコードの成形しバイナリ型に変換
- エンドレコードの成形しバイナリ型に変換
- バイナリを結合しファイル出力する
Mapper(ストリーム結合)
4つのストリームをConcatenateBでヘッダー、データ、トレーラ、エンドの順で結合し1つのバイナリストリームにします。
複数の入力のあるMapperで「イメージをファイルに保存」しても線が全部出力されないで2406で修正されるとよいですね・・
レイヤー
レイヤー名 | レイヤー条件 |
---|---|
移送 | なし |
固定長ファイルの確認用処理
今回の様に、Shift-Jisで出力すれば、テキストエディタで表示する事で中身は確認できます。しかし、データが正しいカラムに移送されているかはそのままではわかりません。エンコードがEBCDICであればなおさらです。固定長の様にデータ内容とカラムの情報直接視認できない形式では、出力結果の確認用の逆変換のCSV化処理を作ると良いでしょう。出力で使用したストリーム定義を利用しますがそのままではマルチフォーマットで確認できないため、確認用の定義は別形式のカラム定義を行います。このフローでは固定長フォーマットを読み込み、それをCSV形式に変換します。
処理フロー
【処理概要】
- 固定長ファイルの読み込み
- ヘッダレコードのみをフィルタしCSVにし、テキストストリームに変換する
- データレコードのみをフィルタしCSVにし、テキストストリームに変換する
- トレーラレコードのみをフィルタしCSVにし、テキストストリームに変換する
- エンドレコードのみをフィルタしCSVにし、テキストストリームに変換する
- テキストファイルを結合し、ファイル出力する
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_”のカラムを移送します。
レイヤー
レイヤー名 | レイヤー条件 |
---|---|
移送 | $record.データ区分 = "1" |
固定長レコード(データレコード)
フィールド名 | データ型 |
---|---|
1 | String |
種別コード | String |
コード区分 | String |
依頼人コード | String |
依頼人名 | String |
振込指定日 | String |
仕向金融機関番号 | String |
仕向金融機関名 | String |
仕向支店番号 | String |
仕向支店名 | String |
預金種目(依頼人) | String |
口座番号(依頼人) | String |
空きエリア | String |
Mapper(データレコード)
このマッパーではデータ区分が2のもののみを出力するMapperです。
レイヤー
レイヤー名 | レイヤー条件 |
---|---|
移送 | $record.データ区分 = "2" |
固定長レコード(データレコード)
フィールド名 | データ型 |
---|---|
2 | String |
被仕向金融機関番号 | String |
被仕向金融機関名 | String |
被仕向支店番号 | String |
被仕向支店名 | String |
手形交換所番号 | String |
預金種目 | String |
口座番号 | String |
受取人名 | String |
振込金額 | String |
新規コード | String |
顧客コード1 | String |
顧客コード2 | String |
振込指定区分 | String |
識別表示 | String |
空きエリア | String |
Mapper(トレーラレコード)
このマッパーではデータ区分が8のもののみを出力するMapperです。
レイヤー
レイヤー名 | レイヤー条件 |
---|---|
移送 | $record.データ区分 = "8" |
固定長レコード(データレコード)
フィールド名 | データ型 |
---|---|
合計件数 | String |
合計金額 | String |
ダミー | String |
Mapper(エンドレコード)
このマッパーではデータ区分が9のもののみを出力するMapperです。エンドは確認が必要が無ければ出力しなくても問題ないと思います。
レイヤー
レイヤー名 | レイヤー条件 |
---|---|
移送 | $record.データ区分 = "9" |
固定長レコード(データレコード)
フィールド名 | データ型 |
---|---|
9 | String |
空きエリア | String |
Mapper(結合)
CSVのストリームはConvertでテキスト型に変換する事で、行ではなくヘッダも含めたオブジェクトとして扱われます。CSV型の場合レコードとして判定されるためこの様な結合は行えませんが(レコード毎に結合されてしまう)オブジェクトではそのストリームをそのまま結合する事でストリームを合成する事が出来ます。そのストリームをファイル出力する事で、各ヘッダを含んだCSVの合成されたテキストファイルになります。
"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などの変換でいまだに出現する形式です。今回は最も単純な変換として全銀協のフォーマットで説明を行いました。次は伝票形式の固定長について扱ってみたいと思います。