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

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

 comma-separated values / tab-separated values / space-separated values

Input(LV3データ)

月別に正規化されたデータです。

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

Prosess(LV4MAKE)

画面に表示するようにデータを整形します。最終的にはDropboxのディレクトリにCSVファイルで出力することで、Webからのアクセスを可能している。処理のポイントは以下

  • LV3の段階で月別になっているので、処理対象の年月をコマンドライン引数で指定
  • 処理の最後にCSVフィアルに整形
  • 支出と収入を同じ列に配置。替わりに区分”支出/収入"追加
  • 画面に表示しない項目(残高)を削除
  • 画面に表示したい項目(No.)を追加
mba:YOKIN 7010oncajon$ cat SHELL/LV4MAKE.YOKIN.MONTH_BALANCE_CSV
#!/bin/bash -vx
#
# LV4MAKE.YOKIN.MONTH_BALANCE_CSV 月別収支SCVのLV4MAKE
#
# usage: LV4MAKE.YOKIN.MONTH_BALANCE_CSV yyyymm
#
# writen by 7010onCajon / Date: 20140709

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

# アプリケーションディレクトリ
apd=/Users/7010oncajon/Dropbox/Public/UNICATGE/YOKIN/MONTH_BALANCE

# ログディレクトリ
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)

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

# LV4データディレクトリ
lv4d=${apd}/DATA/LV4
mkdir -p ${lv4d}

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

# 引数の確認
[ $# -ne 1 ] && ERROR_EXIT
tgt_ym=${1}

# LV3データの読み込み
tgt_file=${lv3d}/${tgt_ym}

# 1:年月日 2:お引出し 3:お預入れ 4:お取り扱い内容 5:残高
cat ${tgt_file} |
# 不要カラムの削除
# 1:お取り扱い内容 2:お引出し 3:お預入れ
self 4 2 3 |
# 収支区分および収支の作成
# 1:収支区分 2:お取り扱い内容 3:収支
awk '{
if($2=="_"){
print "収入", $1, $3
}else{
print "支出", $1, $2
}
}' |
# お取り扱い内容毎に集計を行う
# 1:終始区分 2:内容 3:収支
LANG=C sort -k1,2 |
sm2 1 2 3 3 |
# ソートを行う
LANG=C sort -k1,1 -k3,3nr |
# 通し番号(No.)を付与する
# 1:No. 2:収支区分 3:内容 4:収支
juni |
# CSVヘッダーの付与
awk '
BEGIN{print "no.", "balance_code", "content", "balance"}
{print $0}
' |
# 区切り文字を,(カンマ)に変更
awk 'BEGIN{OFS=","}{print $1, $2, $3, $4}' |
# ファイル出力
# 1:No.,2:収支区分,3:内容,4:収支
cat > ${lv4d}/${tgt_ym}.csv
[ $(plus ${PIPESTATUS[@]}) -eq 0 ] || ERROR_EXIT
echo SUCCESS $(basename $0)
rm -f ${tmp}-*
exit 0

juniコマンド

ユニケージにはちょっと嬉しいコマンドが用意されてるな。

mba:YOKIN 7010oncajon$ man2 juni

Tukubaiオンラインコマンドマニュアル

juni(1)

【名前】

juni : 同一キー内での順位を出力

【書式】

Usage   : juni [<k1> <k2>] <file>
        : juni -h [<k1> <k2>] <file>
Version : Thu Dec 15 13:46:38 JST 2011

【説明】

第<k1>フィールドから第<k2>フィールドまでをキーフィールドとして、同一キーの行ど
うしにおける順位を行の先頭に挿入する。<k1> <k2>を指定しないときは、すべての行が
同一キーとみなすものとする。この場合は単純に行の先頭に行番号を挿入するのと同じ
になる。

-hオプションを指定した場合、各キーフィールドの順位を階層的に出力する。<file>を
指定しない、あるいは、-が指定された時には標準入力からのデータ入力を期待する。

Output(LV4DATA)

csvので出力出来ました。

mba:YOKIN 7010oncajon$ cat /Users/7010oncajon/Dropbox/UNICATGE/YOKIN/MONTH_BALANCE/DATA/LV4/208703.csv
no.,balance_code,content,balance
1,収入,給料振込_会社名,200000
2,収入,交通費振込_会社名,9000
3,支出,カード_ENET000000,60000
4,支出,カード_ENET000001,30000
5,支出,電気料,5000
6,支出,ガスダイ3ガツ,3000
7,支出,ゲスイドウ_シヨウリヨウ,1000

次回はこのCSVファイルをD3.jsを用いて読み込み、支出と収入のバランスをあらわす円グラフを作成します。

以上