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の左の列から対応させることができるみたいな仕組みあったら楽そうだなぁ。