数年前にKAMPO STYLE CLUBカードを作って以来、そこそこ使ってるんですが、csvの形式がヤバい。
何がヤバいって以下な感じ
- 明細以外の余計な情報が大量に入ってる
- 日付が "2017/1/8" みたいな形式なのでソートするとおかしくなる
- SJIS
- ダウンロードしたときのファイル名がcsvの中身の年月と関係ない(DLした日付?)
- 明細部分に余計な情報が混じる(外貨のとき。)
- 行を増やすなカラムにてくれ頼む
で、適当にマトモcsvにしてくれるRubyの書き捨てみたいなコードを書いたので載せとく。
jaccs.rb
# jaccsのどうかと思うcsvを吸い上げてマトモcsvに吐き出すruby
require 'csv'
first_nengappi = true
output = CSV.generate do |ocsv|
Dir.glob('*.csv').each do |input_path|
input = CSV.read(input_path, encoding: "CP932:UTF-8")
in_meisai = false
input.each do |irow|
if first_nengappi && irow[0] == 'ご利用年月日'
ocsv << ['ソート日'] + irow
first_nengappi = false
end
if irow[1] == '<<今回のお支払明細>>'
in_meisai = true
next
end
if irow[1] == '<<次回以降のお支払明細>>'
in_meisai = false
next
end
next unless in_meisai
# 以下、明細本体の場合の処理
# 年月日がない場合も無視でいい
next if irow[0].nil? || irow[0].length == 0
# 出力用に吐き出し
sort_date = Date.parse(irow[0])
ocsv << [sort_date.strftime('%Y/%m/%d')] + irow
end
end
end
# 出力して終わりでいいよね?
puts output
csvをまとめたディレクトリで ruby jaccs.rb
とでもすれば動く。少なくともMacでは動く。
*「え?今になって確定申告のことやってんの?」という煽りコメントはお控え下さい。つらい。