2013-02-25 71 views
-1

我試圖在Ruby中使用CSV庫,並將.csv文件的值存儲到對象參數中。例如,我希望能夠解析.csv文件,將看起來像這樣一個樣本:如何使用Ruby將CSV數據導入類參數?

福特,1996年,藍,雪佛蘭,2000年,綠色

並有計劃將值賦給「汽車」對象有三個參數:做,一年,顏色以後可以像這樣訪問:

car1.make = "Ford" 
car1.year = 1996" 
car1.color = "Blue" 
car2.make = "Chevy" 
car2.year = "2000" 
car2.color = "Green" 

等了任意數量的汽車。

環顧這個網站後,我找到了一些如何做到這一點的例子,但只是輸出到另一個文件或字符串。任何人都可以解釋如何儘可能簡單地做到這一點?我對這種語言很陌生,很容易迷失方向。謝謝!
(對不起,我不明確的,因爲我可以在編輯之前)

+0

你甚至沒有向我們展示了CSV文件的樣子,還是什麼'car1','CAR2 '等等。 – sawa 2013-02-25 05:04:24

+0

你有沒有注意到你顯示的代碼不是一個有效的Ruby表達式(即使'car'和'car2'被定義,'='被'=='取代)? – sawa 2013-02-25 06:38:27

+0

對不起,這個問題讓我意識到我實際上在提問時有多糟糕。 – chadb768 2013-02-28 22:52:22

回答

1
require "csv" 

class Car 
    attr_reader :make, :year, :color 
    def initialize *args; @make, @year, @color = args end 
end 

array_of_cars = 
CSV.read(path_to_csv_file) 
.each_slice(3) 
.map{|args| Car.new(*args.map(&:to_s))} 

array_of_cars[0].make # => "Ford" 
array_of_cars[0].year # => "1996" 
array_of_cars[0].color # => "Blue" 
array_of_cars[1].make # => "Chevy" 
array_of_cars[1].year # => "2000" 
array_of_cars[1].color # => "Green" 

,或者如果你可以與具有生活:

array_of_cars[0].make # => "Ford" 
array_of_cars[0].year # => 1996 
array_of_cars[0].color # => "Blue" 
array_of_cars[1].make # => "Chevy" 
array_of_cars[1].year # => 2000 
array_of_cars[1].color # => "Green" 

然後

array_of_cars = 
CSV.read(path_to_csv_file) 
.each_slice(3).map{|args| Car.new(*args)} 
+0

'OpenStruct'似乎足夠了,不是嗎? – mudasobwa 2013-02-25 06:07:29

+0

這是一個偏好問題。 – sawa 2013-02-25 06:33:17

+1

...直到超過9000個汽車屬性存儲:-) – mudasobwa 2013-02-25 06:36:19

0
str = "Ford, 1996, Blue, Chevy, 2000, Green" 
keys = [:make, :year, :color] 

str.split(',').each_slice(3).map { |m| 
    Hash[keys.zip m.map(&:strip)] 
} 

# ⇒ [ 
# ⇒ [0] { 
# ⇒  :color => "Blue", 
# ⇒  :make => "Ford", 
# ⇒  :year => "1996" 
# ⇒ }, 
# ⇒ [1] { 
# ⇒  :color => "Green", 
# ⇒  :make => "Chevy", 
# ⇒  :year => "2000" 
# ⇒ } 
# ⇒ ] 

我們來看看代碼。 str.split(',')使用,作爲分隔符分割字符串,each_slice(3)將我們在前一次迭代中獲得的數組分割爲三個元素。然後我們迭代這些,將鍵和值展開(由3分組)到哈希實例(剝離值,因爲在用逗號分割字符串後留下空格)。

如果您想通過cars[0].make訪問元素,而不是cars[0][:make],需要小猴子修補:

class Hash 
    def method_missing(m, *args) 
    if self.has_key?(m) 
     return self[m] 
    else 
     super 
    end 
    end 
end 
+0

謝謝!這非常有幫助!如果可以的話,我會贊成這個! – chadb768 2013-02-28 22:51:07