ネットの海の片隅で

技術ネタの放流、あるいは不法投棄。

RubyにCSV.mapが欲しい。

CSVという邪悪なファイルを扱っていると、CSVの各行を配列のまま取り回すのではなく、各行から必要なデータだけを取り出して小さい配列にしたり、あるいは、自分に都合の良いオブジェクトを生成した上でいろいろと取り回したいことが結構ある。こんな感じ。

books = []
CSV.foreach("path/to/books.csv") do |row|
  books << Book.new(row[0], row[20], ...)
end

当然、この書き方でも動くんだけど、あまりキレイじゃない。

すると、こう書くことになる。

books = CSV.read("path/to/csv").map{|row| Book.new(row[0], ...) }

1行になって嬉しい。

ただ、これだとCSVのサイズによってはreadメソッドで巨大な配列を生成してしまうのが嬉しくない。

そこで、出来れば次のように書いて初めのように動いて欲しい。

books = CSV.map("path/to/csv"){|row| Book.new(row[0], ...) }

RubyCSVライブラリは非常によくできていると思っていて気に入ってるんだけど、このあたりはちょっとだけ不便に感じてるという個人の日記でした。