全銀ファイルフォーマットを扱うことになったんですが、銀行側からくる口座振替のファイルをみて驚きました。
各レコードを区別する改行が無いのです。
全銀フォーマットが固定長なのは知ってましたが、改行が無いのは見づらいです。
ということで改行無の全銀フォーマットを見やすくするアプリを作りました。
取り合えず下記の要件を実装します。
・120桁おきに改行コードを入れてテキストに出力
・口座振替のフォーマットに従って各フィールドをカンマ区切りにしCSV出力
テキストボックス txtTargetFile.Text に読み込むファイルパスが格納されており、ラジオボタン rdoToCSV がチェック有りなら上記要件の2つ目CSV出力とします。
ソースはこんな感じです。ざっと作ったのできれいじゃないところも有りますが。(C#)
private void btnOK_Click(object sender, EventArgs e){
//1行の長さ
int cLineLength = 120;
//ファイル読み込み
string strFile = File.ReadAllText(txtTargetFile.Text, Encoding.GetEncoding("Shift_JIS"));
bool bHeadItemOut = false;
bool bDataItemOut = false;
bool bTrailerItemOut = false;
int idx = 0;
//変換後の結果格納
StringBuilder strOutput = new StringBuilder();
while (idx < strFile.Length){
//120文字読み込み
string strLine = strFile.Substring(idx, cLineLength);
//CSVにしたいなら
if (rdoToCSV.Checked){
int lIdx = 0;
int[] fWidth = new int[] { };
int iDataType = 0;
if (int.TryParse(strLine.Substring(0, 1), out iDataType)){
switch (iDataType){
case 1:
//ヘッダレコード
if (!bHeadItemOut){
strOutput.AppendLine("データ区分,種別コード,コード区分,依頼人コード,依頼人名,引落日,取引金融機関番号,取引金融機関名,取引支店番号,取引支店名,預金種目(委託者),口座番号(委託者),ダミー");
bHeadItemOut = true;
}
fWidth = new int[] { 1, 2, 1, 10, 40, 4, 4, 15, 3, 15, 1, 7, 17 };
break;
case 2:
//データレコード
if (!bDataItemOut){
strOutput.AppendLine("データ区分,引落金融機関番号,引落金融機関名,引落支店番号,引落支店名,ダミー,預金種目,口座番号,預金者名,振替金額,新規コード,顧客番号,振替結果コード,ダミー");
bDataItemOut = true;
}
fWidth = new int[] { 1, 4, 15, 3, 15, 4, 1, 7, 30, 10, 1, 20, 1, 8 };
break;
case 8:
//トレーラレコード
if (!bTrailerItemOut){
strOutput.AppendLine("データ区分,合計件数,合計金額,振替済件数,振替済金額,振替不能件数,振替不能金額,ダミー,預金者名,振替金額,新規コード,顧客番号,振替結果コード,ダミー");
bDataItemOut = true;
}
fWidth = new int[] { 1, 6, 12, 6, 12, 6, 12, 65 };
break;
case 9:
//エンドレコード
fWidth = new int[] { 1, 119 };
break;
default:
break;
}
foreach (int width in fWidth){
strLine = strLine.Insert(lIdx + width, ",");
lIdx = ++lIdx + width;
}
}else{
idx += cLineLength;
continue;
}
}
strOutput.AppendLine(strLine);
idx += cLineLength;
}
//保存
SaveFileDialog dlg = new SaveFileDialog();
dlg.InitialDirectory = Path.GetDirectoryName(txtTargetFile.Text);
dlg.FileName = Path.GetFileNameWithoutExtension(txtTargetFile.Text) + "_可読化";
dlg.Filter = "textファイル(*.txt)|*.txt|csvファイル(*.csv)|*.csv|すべてのファイル(*.*)|*.*";
if (rdoToCSV.Checked)
dlg.FilterIndex = 2;
if (dlg.ShowDialog() == DialogResult.OK){
File.WriteAllText(dlg.FileName, strOutput.ToString(), Encoding.GetEncoding("Shift_JIS"));
}
}