rubyでcsv

わたくし仕事でCSVの加工をものすごくさせられるのですよ。
それはもう馬車馬のようにカンマを数えるようなかんじなのですよ。

rubycsvというライブラリが非常にベンリーなのですが、ぶった切って配列格納までなので、例えば

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からもしたいじゃーん」という会社のひともいるだろうと思ったから。

正直「できる」というだけであって危なそうな部分も多々だし、先輩オブジェクトのメソッドなんかほとんど使わなくても今までなんとかなっていたので、こうして公開して先達のご意見などいただけるかもなと思った次第であります!!

軍曹に渇を入れていただきたいのであります!!!