1 of 10

Rubyで確定申告楽したい

Kanazawa.rb Meetup #67

Takayuki Takagi

2 of 10

自己紹介

  • Takayuki Takagi (高木貴之 / にぼし)
  • @TAKAyuki_atkwsk / takayukiatkwsk
  • フリーランスエンジニア
  • Web API、AWS、Dockerなどなど
  • ビールと餃子が好き🍻🍻🍻

3 of 10

今日の話

  • 確定申告終えました
  • freeeでだいぶ楽した
  • 事業用口座ではなく、個人用口座から引き落としている経費等の登録も楽したい
  • Rubyで解決する

4 of 10

個人用口座のデータ抽出

  • だいたいの銀行やクレカは明細をCSV形式でダウンロードできる(はず)
  • これをreadしてparseすればあとは好き勝手にデータ抽出できる
  • 今回はreadしてparseする処理だけRubyで作成
  • 抽出はreplでポチポチ
  • 実はKanazawa.rb#59で原形は作っていた

5 of 10

作ったやつ

load ‘lib/mufg.rb’

mufg = Mufg.new()

mufg.import(‘mufg-2017.csv’)

mufg.parsed_data.map{|d| d.summary }.uniq

=> ["年金", "振込1", "振込IB1", "カードC1", "電気",

"電話","税金", "国年基金", "振替/定期", "カ−ド",...]

# importメソッドでCSVデータがparsed_dataに取り込まれる

# 各カラムに対応するread_attr設定済み

# 項目一覧を抽出して必要そうな項目を見つける

# 年金は控除に必要そうだからこの支払い一覧欲しいなという気持ちになる

6 of 10

作ったやつ

# 年金の支払い一覧を抽出するパターン

mufg.parsed_data

.select{|d| d.summary == '年金' }

.map{|d| "#{d.date}, #{d.payment}, #{d.summary_description}" }�=> ["2017/1/4, 16260, コクミンネンキン",� "2017/1/31, 16260, コクミンネンキン",� "2017/2/28, 16260, コクミンネンキン",� ...� ]

# 経費についてはこの様な結果を1件ずつfreeeにコピペして登録した

# (この作業はだるい)

7 of 10

作ったやつ

# 取り込んだCSVデータは配列になってるので自由に操作可

# 年金支払い総額を知りたい

# 畳み込み処理はRubyではfoldじゃなくてreduce|injectだったのを忘れていた

mufg.parsed_data

.select{|d| d.summary == '年金' }

.reduce(0){|sum, d| sum + d.payment }�=> 276940

8 of 10

コンバーター

  • https://goo.gl/ZMtiX4
  • CSV::Converters
  • 文字列→特定クラスの値に変換してくれる
  • ex) :numeric, :date
  • CSV.newなどの:convertersオプションに渡せる
  • 今回はカンマ入りの数値を整数クラスの値として扱いたいので自作した

9 of 10

作ったやつ

# カンマ入り数値を整数クラスの値に変換する

# 参考 https://goo.gl/t9AaTi

converters = {� integer: -> (f) {� begin� e = f.encode(CSV::ConverterEncoding)� e =~ /[\d,]+/ ? Integer(e.gsub(/,/, '')) : f� rescue� f� end� }�}

CSV.foreach(filename, converters: converters[:integer])

10 of 10

まとめ

  • 配列にしてしまえば割と何でもできる
  • 各金融機関のCSVについてのドキュメントがない
  • CSVデータは癖があるので読み込み実装でカバー必要
  • ともかく雑に作ってある程度楽することができた