ユニケージしてみた。(その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データを生成するシェルです。主な処理は以下。
あっ、ユニケージコマンドを使っていない。。。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
以上