キモブロ

Please spy check please, Fucking retard

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というメソッドが欲しい
  • 先頭行シカトしない方法無いっぽい