-1

Ruby で CSV ライブラリを使用し、.csv ファイルの値をオブジェクト パラメータに格納しようとしています。たとえば、次のサンプルのような .csv ファイルを解析できるようにしたいと考えています。

フォード, 1996、青, Chevy, 2000、緑

そして、プログラムに次のように後でアクセスできるように、3 つのパラメーター (メーカー、年、色) を使用して値を「車」オブジェクトに割り当てさせます。

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

任意の数の車についても同様です。

このウェブサイトを見回した後、これを行う方法の例をいくつか見つけましたが、別のファイルまたは文字列に出力するためだけです。できるだけ簡単な方法でこれを行う方法を説明できる人はいますか? 私はこの言語に非常に慣れていないため、簡単に迷子になります。ありがとう!
(編集前の説明不足で申し訳ありません)

4

2 に答える 2

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)}
于 2013-02-25T05:30:16.213 に答える
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(',')文字として使用して文字列を分割し、前の反復で取得した配列を 3 つの要素ごとに分割します。次に、これらを繰り返し、キーと値 (3 でグループ化) をハッシュ インスタンスに展開します (文字列をコンマで分割した後にスペースが残っていたため、値を削除します)。,each_slice(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 
于 2013-02-25T05:53:08.913 に答える