rubyでcsv
わたくし仕事でCSVの加工をものすごくさせられるのですよ。
それはもう馬車馬のようにカンマを数えるようなかんじなのですよ。
rubyのcsvというライブラリが非常にベンリーなのですが、ぶった切って配列格納までなので、例えば
id,title,author,category
001,カラマーゾフの兄弟,ドストエフスキィ,兄弟もの
002,桜の園,チェーホフ,劇画
とかいうデータがあったときに
books.each do |book| puts book.title end
とかしたいなと思い(ORM狂い)、思いつくまま次のようなものを書いてみた。「books = CSVHacks.new(filename)」とかしたら「books.each do |book| 〜 end」とかの中でどうにかできるようなもの。ちなみに1行目はカラム名。
require 'csv' class Hash def method_missing(method) if self.has_key?(method.to_s) self[method.to_s] else "has no key" end end end class Mapper def initialize @data = [] end def columns? @data[0].keys end def length @data.length end def each for itm in @data yield(itm) end end def method_missing(method,*arg) if @data[0].has_key?(method.to_s) @data[arg[0].to_i][method.to_s] else "has no key." end end end class CSVHacks < Mapper def initialize(file) @data = [] @itm_keys = [] cnt = 0 CSV.open(file, "r") do |row| ary = row.to_a if cnt == 0 @itm_keys = ary else line_hash = {} ary.each_with_index do |itm,i| line_hash[@itm_keys[i]] = itm end @data << line_hash end cnt += 1 end end end
こんなんで一応eachの中でbook.titleとかbook.categoryとかできるけど、シンタックスシュガア(なのかしら??)としてbook.title(array_num)みたいなこともできるようにした。ちなみになぜ継承するようにしたかというとあとから「excelからもしたいじゃーん」という会社のひともいるだろうと思ったから。
正直「できる」というだけであって危なそうな部分も多々だし、先輩オブジェクトのメソッドなんかほとんど使わなくても今までなんとかなっていたので、こうして公開して先達のご意見などいただけるかもなと思った次第であります!!
軍曹に渇を入れていただきたいのであります!!!