SUICAの明細をDBに取り込めたのはいいのですが、運用していかないといけません。
SUICAの明細は過去100件分しか出力できないので重複するものが出てきます。
なので重複処理も簡単なDBで管理することにしたのですが、今回2回目のインポートをやってみます。
前回と合わせて2つの明細があります。
- JE30F819101423311_20210825_20210925110904.pdf
- JE80F621092507956_20210909_20211013221045.pdf
0825〜0925と0909〜1013の明細なので、09/09から09/25までのレコードが重複しています。
中身チェック
データはインポート済みなので中身を確認します。
件数
sqlite> SELECT count(*) FROM expenses; 200
ファイル2つ分なので200件分入ってます。
重複を除いたレコード数
distinctで重複レコードをまとめることができます。
ネット上ではdistinctでカラムを選択する例が多いですが、*で行ごとまとめられる様です。
サブクエリで重複を除いてからカウントします。
sqlite> SELECT count(*) FROM (SELECT distinct * FROM expenses); 148
148件になりました。
詳細を見てみます
一応中身も見てみます。
ナンバリング用のカラムは作ってないのでROW_NUMBER() OVER()で出しました。
(sqlite3 ver3.31.1)
sqlite> SELECT ROW_NUMBER() OVER(), * FROM (SELECT distinct * FROM expenses); 1|08/25|カード|3,320|3000 2|08/25|入|3,142|178 3|08/25|物販|2,300|842 4|08/25|入|2,122|178 5|08/25|入|1,649|473 6|08/26|物販|1,016|633 7|08/27|物販|487|529 8|08/27|カード|3,487|3000 9|08/27|物販|2,352|1135 10|08/28|物販|1,952|400 (略) 140|10/08|カード|3,215|3000 141|10/08|入|3,037|178 142|10/08|入|2,564|473 143|10/08|物販|1,944|620 144|10/09|物販|1,261|683 145|10/10|物販|299|962 146|10/11|カード|3,299|3000 147|10/11|物販|1,967|1332 148|10/12|物販|967|1000
終盤のレコードもPDFのデータと合ってます。(見せられないけど)
OK。
9月分の使用額確認
8月と10月は日付が中途半端なので9月分だけ出してみます。
sqlite> SELECT description, sum(amount) FROM (SELECT distinct * FROM expenses) ...> WHERE date LIKE '%09/%' GROUP BY description; 入|16406 物販|21927 カード|39000
「入」は電車賃です。交通費支給されるし私用でもあまり乗らないので気にしません。
物販がメインの使用額ですね。
今後のデータを取らないとわかりませんが、物販はほとんどコンビニ払いなので2万はちょっと使いすぎな気がします。
スーパーで買う食費とは別なのでコンビニでの買い物を改めないといけませんね。(お酒、おつまみ、煙草しか買ってないけど)
まとめ
まとめるほど長い処理は行っていませんが、さすがDBです。重複確認といった面倒くさい処理も簡単に終わりました。
あとはデータが溜まったら月ごとの集計をすればOKです。
SQL文の発行をどうするか迷います。
シンプルにshellスクリプトでも良さそうですが、インポート処理がpythonなので呼び出しもpythonで統一したほうがいいですかね。