ユニケージしてみた。(その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を用いて読み込み、支出と収入のバランスをあらわす円グラフを作成します。
以上