読者です 読者をやめる 読者になる 読者になる

ユニケージしてみた。(その3:LV2MAKE編)

ユニケージしてみた。(その3:LV2MAKE編)

和暦表記はなくなればいいのに。

Input(LV1データ)

入力のデータはWeb通帳からダウンロードできるCSVファイルとする。ファイル名や中身に和暦表現が含まれているのが面倒である。なお、以下のデータはダミーです。

mba:YOKIN 7010oncajon$ cat DATA/CSV/平成\ 99年\ 3月\ 1日から平成\ 99年\ 3月\ 31日.csv
"年月日(和暦)","お引出し","お預入れ","お取り扱い内容","残高"
H99.03.01,60000,,"カード ENET000000",500000
H99.03.07,30000,,"カード ENET000001",470000
H99.03.16,5000,,"電気料",465000
H99.03.19,,200000,"給料振込 会社名",665000
H99.03.27,3000,,"ガスダイ3ガツ",662000
H99.03.28,1000,,"ゲスイドウ シヨウリヨウ",661000
H99.03.28,,9000,"交通費振込 会社名”,670000

Process(LV2MAKE)

LV2データを生成するシェルです。主な処理は以下。

  • 和暦を西暦に変換
  • 文字コードの変換
  • csvヘッダの除外
  • カンマ区切りを空白区切りに変更
  • 空のカラムを_(アンダーバー)に変更

あっ、ユニケージコマンドを使っていない。。。awkバンザイ、sedバンザイ

mba:YOKIN 7010oncajon$ cat SHELL/LV2MAKE.YOKIN
#!/bin/bash -vx
#
# LV2MAKE.YOKIN 預金データのLV2MAKE
#
# usage: LV2MAKE.YOKIN
#
# writen by 7010onCajon / Date: 20140707

# ホームディレクトリ
homed=/Users/7010oncajon/Documents/Programing/UNICAGE/YOKIN

# ログディレクトリ
logd=${homed}/LOG
mkdir -p ${logd}
logf=${logd}/LOG.$(basename $0).$(date +%Y%m%d)
exec 2> ${logf}

# tmpディレクトリ
tmpd=${homed}/TMP
mkdir -p ${tmpd}
tmp=${tmpd}/$$.$(basename $0).$(date +%Y%m%d).$(date +%H%M%S)

# LV1データディレクトリ
lv1d=${homed}/DATA/CSV
mkdir -p ${lv1d}

# LV2データディレクトリ
lv2d=${homed}/DATA/LV2/YOKIN
mkdir -p ${lv2d}

# エラー処理
ERROR_EXIT(){
echo ERROR__ $(basename $0)
rm -f ${tmp}-*
exit 1
}

# LV1データ(CSVファイルの読み込み)
export LANG=C
ls ${lv1d}/平成*年*月*日から平成*年*月*日.csv |
while read csv_file; do
# LV2データのファイル名を取得
# yyyymmdd_yyyymmdd
lv2_file=$(
echo "${csv_file}" |
sed -e 's/.*平成 \(.*\)年 \(.*\)月 \(.*\)日から平成 \(.*\)年 \(.*\)月 \(.*\)日.csv/\1 \2 \3 \4 \5 \6/' |
awk '{printf("%04s%02s%02s_%04s%02s%02s\n", $1+1988, $2, $3, $4+1988, $5, $6)}'
[ $(plus ${PIPESTATUS[@]}) -eq 0 ] || ERROR_EXIT
)

# LV2データの作成
# 1:"年月日(和暦)",2:"お引出し",3:"お預入れ",4:"お取り扱い内容",5:"残高"
cat "${csv_file}" |
# 文字コードの変換
nkf -wLux |
# 先頭のcsvヘッダを除去する
tail -n +2 |
# (末尾の)空行を除去する
sed '/^$/d' |
# nullを_に置換
sed 's/^,/_,/g' | sed 's/,,/,_,/g' | sed 's/,$/_,/g' |
# 半角および全角スペースを_および_に変換する
sed 's/ /_/g' | sed 's/ /_/g' |
# "(ダブルクォート)を除去する
sed 's/^"//g' | sed 's/,"/,/g' | sed 's/",/,/g' | sed 's/"$//g' |
# ,(カンマ)を半角スペースに変換する
sed 's/,/ /g' |
# 和暦(平成)を西暦に変換
awk '{
y=substr($1,2,2)+1988; m=substr($1,5,2); d=substr($1,8,2);
$1=sprintf("%04s%02s%02s", y, m, d);
print;
}' |
# ファイル出力
# 1:年月日(西暦) 2:お引出し 3:お預入れ 4:お取り扱い内容 5:残高
cat > ${lv2d}/${lv2_file}
[ $(plus ${PIPESTATUS[@]}) -eq 0 ] || ERROR_EXIT
done

echo SUCCESS $(basename $0)
rm -f ${tmp}-*
exit 0

Output(LV2データ)

だいぶスッキリとしたデータになりました。なおketaコマンドは桁揃えをしてくれるユニケージコマンドです。

mba:YOKIN 7010oncajon$ cat DATA/LV2/YOKIN/20870301_20870331 | keta
20870301 60000      _ カード_ENET000000 500000
20870307 30000      _ カード_ENET000001 470000
20870316  5000      _             電気料 465000
20870319     _ 200000   給料振込_会社名 665000
20870327  3000      _         ガスダイ3ガツ 662000
20870328  1000      _     ゲスイドウ_シヨウリヨウ 661000
20870328     _   9000 交通費振込_会社名 670000

以上