Ruby:将CSV列表转换为单独的对象

时间:2010-11-18 18:36:16

标签: ruby csv object

我是Ruby的新手,作为我学习的一部分,我有一项任务是将CSV文件转换成我可以按价格等排序的东西。但是我在创建对象列表时遇到了问题。我知道我可以创建object1,object2等,但我不知道如何自动执行此操作。

这是我到目前为止的代码:

class Product
  attr_reader :id, :name, :price, :stock
  def initialize(id,name,price,stock)
    @id = id
    @name=name
    @price=price
    @stock=stock
  end
  def readout(variable)
    print product.id
    print "|"
    print product.name
    print "|"
    print product.price
    print "|"
    print product.stock
    puts ""
  end
end


products = []
newproducts= []
File.open("products.csv" , "r") do |f|
 f.each_line do |line|
   products << line
 end
end

puts products

products.each do |product|
  data = product.split(",")
  inbetween = Product.new(data[0].to_s, data[1].to_s, data[2].to_i, data[3].to_i)
  inbetween
  newproducts << inbetween
end

newproducts.sort_by{|x| x.price}

newproducts.each do |product|
print product.id
print "|"
print product.name
print "|"
print product.price
print "|"
print product.stock
puts ""
end

2 个答案:

答案 0 :(得分:2)

最简单的事情可能是创建一个列表,然后在创建每个新产品时,只需将其推送到列表中即可。然后,您可以使用sort_by对列表进行排序。

因此,在您的代码中,您拥有数组newproduct,所以只需执行此操作:

products.each do |product|
  data = product.split(",")
  newproduct.push(Products.new(data[0], data[1], data[2], data[3]))
end

如果您想按价格排序:

newproduct.sort_by{|x| x.price}

答案 1 :(得分:1)

当然,有许多方法可以解决你所获得的任务,我认为你不是一个可行的解决方案。如果您确实在创建时确保实际保存了Products类,则可以使用可以使用的列表。

newproducts << Product.new(data[0], data[1], data[2], data[3])

您可能会注意到,我对您的语法进行了一些调整。我将产品类更改为产品,因为它只跟踪一个产品。然后我还将数组名称从newproduct更改为newproducts,因为这实际上是存储不同产品的地方。

之后,您有一个数组对象,您可以使用。

执行sort_by任务