クレジットカードのCSVをrubyで扱えるscriptを書いた

クレジットカードが不正利用されていないかとか、どれぐらい月に使っているとかを確認するために
毎月送られてくる明細と、控えを見比べたりする習慣があったのですが
去年ぐらいから紙の送付が無くなって明細チェックもしなくなってしまっていました。
 
CSV(PDF)でダウンロードしてください的な ことになって CSVを生でのぞくのはかなり面倒だったので、
rubyCSVをパースするscriptを書いてみました。
 
クレジット会社はこちら

Railsに組み込む予定。

実行例

$ ruby idemitsu_importer.rb
#<struct Struct::Statement date="2012/12/09", name="ケイキユウ(ストア", price=2106>
#<struct Struct::Statement date="2012/12/19", name="トウキヨウガス", price=2929>
#<struct Struct::Statement date="2012/12/28", name="アツプル アイチユ−ンズ ストア", price=1070>
#<struct Struct::Statement date="2013/01/03", name="PP *FASTSPRING BARTEND", price=1355>
#<struct Struct::Statement date="2013/01/03", name="AMAZON.CO.JP", price=794>

example csv

カード名称,出光カードほげほげ
お支払日,2013/03/07
今回ご請求額,0123456789

利用日,ご利用店名及び商品名,本人・家族区分,支払区分名称,締前入金区分,利用金額,備考
2012/12/09,ケイキユウ(ストア,,1回,,2106,
2012/12/19,トウキヨウガス,,1回,,2929,
2012/12/28,アツプル アイチユ−ンズ ストア,,1回,,1070,
2013/01/03,PP *FASTSPRING BARTEND,,1回,,1355,現地通貨額:1355.00
,(1234567890),,,,,円換算レート: 1/04 1.0000
2013/01/03,AMAZON.CO.JP,,1回,,794,

こんなフォーマットです。 日本円以外の明細は2行で表示されます。
必要項目は、date、name、priceぐらいなのでstructで返すようにしました。
一見簡単なのですが、CSVファイルはWindows31-Jなので
rspecでテストを書くときに文字コードを気にしないといけません。
 
そこで、こちらで紹介されている
trで置換を行っています。

      SJIS_MAPPINGS  = "\u{301C 2016 2212 00A2 00A3 00AC 2014 00A6}"
      CP932_MAPPINGS = "\u{FF5E 2225 FF0D FFE0 FFE1 FFE2 2015 FFE4}"
      def self.cp932_to_sjis(str)
        str.tr(CP932_MAPPINGS, SJIS_MAPPINGS)
      end

参考:
2008-02-17 - はてなるせだいあり