paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

SUICAの利用明細をDBに取り込みたい 重複レコード削除編

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で統一したほうがいいですかね。