CSVの構造をDSLで定義して読み込み系モジュール その2 csv-omg
https://github.com/eval/csv-omg
インストール
gem install csv-omg
使ってみる
require 'csv-omg' class User include CsvOmg col :first_name, 'First Name' col :last_name, 'Last Name' col :age, 'Age' end p users = User.parse(File.read("./test.csv")) # [#<User:0x00000001167230 @first_name="John", @last_name="Doe", @age="27">, #<User:0x00000001166b28 @first_name="Jane", @last_name="Doe", @age="26">, #<User:0x00000001171d70 @first_name="Bat", @last_name="Man", @age="52">]
これ望んでるものに近いなぁ。CSVの先頭行の名前とフィールド名をクラス定義の際にマッピングさせてる。わかりやすい。
先頭行がヘッダーの役割をしていないCSVは扱えるのかどうか。
普通に数字で指定すれば列のindexでマッピング出来るっぽい。こんな感じで↓
class User include CsvOmg col :first_name, 0 col :last_name, 1 col :age, 2 end csv_data = <<EOT kimoto,takumi,1 livedoor,tarou,2 nhn,tarou,3 EOT users = User.parse(csv_data) p users # => [#<User:0x000000019fea10 @first_name="livedoor", @last_name="tarou", @age="2">, #<User:0x000000019fe308 @first_name="nhn", @last_name="tarou", @age="3">]
ますます望んでるものに近いなぁ。これは便利だ。
しかし、先頭行がシカトされてないので読み込めてない。。
型の指定
class User include CsvOmg col :first_name, 0, String col :last_name, 1, String col :age, 2, Integer end
こんな感じで指定すれば自動で型変換してくれるっぽい。対応してる型はDate, DateTime, Float, Integerな模様。
ちょい少ないなぁ。PathInfoとか指定できたら神じゃね。
感想
だいぶ満足。だけどちょっと不満。不満点は
- 行が1つのまとまりを持っているのではなくて、列がまとまりを持ってる場合にどう扱うのか
- 型変換できる種別が少ない
- モジュール名が舐めてる(omg)
- #parse_fileというメソッドが欲しい
- 先頭行シカトしない方法無いっぽい