2006.11.08

Ruby Rails

CSVファイルの各行をオブジェクトに変換する

すいません、シェルとか使えません。かといってC++で直接CSV扱うとかもちょっと。。。

ということで、普段はRubyでCSV扱ってます。具体的には、RubyにはCSVクラスがあるので、こいつを使ってCSVの各行をオブジェクトに変換してます。

ソースはこんな感じ。CSVReaderの内部にあるDataクラスのアクセッサとimportメソッドを変更すれば、任意のCSVを扱えます。

#!/usr/bin/ruby
require "csv"
 
class CSVReader
 
  class Data
    attr_accessor :x, :y, :eval
    def import ( array )
      self.x = array[0].to_f
      self.y = array[1].to_f
      self.eval = array[2].to_f
    end
  end
  
  def self.read( file_path )
    datas = Array.new
    CSV.foreach( file_path ) do | row |
      data = Data.new
      data.import( row )
      datas << data
    end
    return datas
  end
  
end

こんな感じで使います。

file_path = "result.csv"
datas = CSVReader.read( file_path )

あと、適当な列でソートしたい場合は、CSVReaderクラスのreadメソッドを次のように書き換えてます。

  def read
    rows = Array.new
    CSV.foreach( self.file_path ) do | row |
      row[0] = row[0].to_f
      row[1] = row[1].to_f
      row[2] = row[2].to_f
    end
    # 1番目の列でソートする場合
    rows = rows.sort { |a,b| a[1] <=> b[1] }
    datas = Array.new
    rows.each do |row|
      data = Data.new
      data.import( row )
      datas << data
    end
    return datas
  end