2011-09-29 83 views
0

我必須解析csv文件,它有他們訂購的客戶和產品。客戶可以重複使用不同的產品。我必須得到他們訂購的所有獨特客戶和產品。然後打印出每個客戶和那裏的產品。我一直在問一個面向對象的方式來做到這一點 1)我應該創建一個客戶對象,並有一個產品,因爲屬性 2)只寫使用的foreach和循環的程序通過和存儲客戶和產品在哈希和打印出來 。面向對象和解析csv

讓我失望的是我被要求以面向對象的方式去做。如果通過創建對象來實現,我如何將自定義對象存儲在內存中?所以如果我第二次遇到客戶,我必須添加產品,最後我必須遍歷所有對象並打印出來。抱歉,我的英語感覺很糟糕,感謝您閱讀一個長長的問題和幫助。

+0

也許你應該發佈你將如何做,並尋求改進建議。 – Miguel

回答

1

如何將自定義對象存儲在內存中?通過創建對象並將其保存在列表,哈希或任何看起來合適的內容中。 (可能是一個散列,關鍵是你在CSV中有什麼獨特的價值,價值將是一個產品集合。)

被要求以「面向對象的方式」來做是有點任意的,但是。

0

如果您正在使用FasterCSV或Ruby 1.9可以擴展分析器讓您每個CSV行映射到一個自定義對象。

# http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html#method-c-load 
# http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html#method-c-dump 
# https://github.com/JEG2/faster_csv/blob/master/test/tc_serialization.rb 
require 'csv' 

class Person 
    attr_accessor :id, :name, :email 

    def self.csv_load(meta, headers, row) 
    person = Person.new 
    headers.each.with_index { |h,i| 
     person.send "#{h}=", row[i] 
    } 
    person 
    end 

    def self.parse(csv) 
    meta = "class,#{self.to_s}\n" 
    CSV.load("#{meta}#{csv}") 
    end 

    def dump 
    self.class.dump([self]) 
    end 

    def self.dump(people, io='', options={}) 
    CSV.dump(people, io, options).strip 
    end 

    def self.csv_meta 
    [] 
    end 

    def csv_headers 
    %w(id name email) 
    end 

    def csv_dump(headers) 
    headers.map { |h| self.instance_variable_get "@#{h}" } 
    end 

end 

CSV_DUMP = <<-CSV 
class,Person 
id=,name=,email= 
1,"First Dude",[email protected] 
2,"Second Dude",[email protected] 
3,"Third Dude",[email protected] 
CSV 

CSV_INPUT = <<-CSV 
id,name,email 
1,"First Dude",[email protected] 
2,"Second Dude",[email protected] 
3,"Third Dude",[email protected] 
CSV 

CSV_DUMP2 = <<-CSV 
class,Person 
#{CSV_INPUT} 
CSV 

people = Person.parse(CSV_INPUT) 
puts people.inspect 
dumped = Person.dump(people) 
puts dumped 
puts "----" 
puts Person.parse(dumped).inspect