3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(.Net)改行無しの全銀フォーマットを可読化する

全銀ファイルフォーマットを扱うことになったんですが、銀行側からくる口座振替のファイルをみて驚きました。

各レコードを区別する改行が無いのです。

全銀フォーマットが固定長なのは知ってましたが、改行が無いのは見づらいです。

ということで改行無の全銀フォーマットを見やすくするアプリを作りました。

取り合えず下記の要件を実装します。

・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"));

}

}