キモブロ

Please spy check please, Fucking retard

CSVをDSLで定義した感じで読み込めるCSVMapper作った

https://github.com/kimoto/csvmapper

Usage

require 'csvmapper'
class MyCSV < CSVMapper
  column :name, 0, :integer
  column :ipaddr, 1, :ipaddr
  column :file_path, 2, :pathname
  column :time, 3, :time
end

p MyCSV.load("name1,127.0.0.1,./tmp/path/to/file.txt,2012/01/01")
 # => [{"name":"name1","ipaddr":"127.0.0.1","file_path":"./tmp/path/to/file.txt","time":"2012-01-01 00:00:00 +0900"}]

なんとなく動くけど、もうちょい作り込む予定。可能な限りよくあるパターンでは何も記載しなくてすむようなデフォルト値にしていきたい。

それぞれのcolumnには&blockを渡すことができて、これでフィルタを記載できる。以下はその例

class MyCSV < CSVMapper
  column :name, 0, :string do |v|
    v.upcase
  end
end
EOT

もちろんblockを渡す部分はRubyでは&:blockと記載できるので上記と同じ意味のコードを次のような感じでも記載できる

class MyCSV < CSVMapper
  column :name, 0, :string, &:upcase
end
  • 先頭行がヘッダーでその行を無視したいときは ignore_header_line 1とすると1行目が無視される
  • delimiter '<>'とかするとカラムを分割する記号が変更できる
  • on_error_go_to_next_lineって書くと、パース失敗したときでも続行して次の行の解析に移る
  • CSVMapper#to_jsonを使えばjson化可能

まだ完成してないので後で書くのと、がんがん機能追加していきたい
columns :name, :age, :time って書くとCSVの左の列から対応させることができるみたいな仕組みあったら楽そうだなぁ。