2010-11-18 59 views
1

我是Ruby的新手,作为学习的一部分,我得到了一个任务,将CSV文件转换为我可以按价格等进行排序的任务。但是,我无法创建对象列表。我知道我可以制作object1,object2等,但我不知道如何自动执行此操作。Ruby:将一个CSV列表转换为单独的对象

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

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 
+0

你应该看看FasterCSV的宝石。做product.split(“,”)不会处理嵌入式逗号等内容。 FasterCSV将处理更广泛的输入。否则,我会采取非常类似的方法来处理你已经在做的事情。 – 2010-11-18 23:03:09

+0

恐怕我的学校想要我们写这样的东西开始。 – Fallion 2010-11-19 18:29:53

回答

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} 
+0

我如何将它变成名字?因为输出是。 – Fallion 2010-11-18 19:54:18

+0

#<产品:0x1b192059> #<产品:0xe9ac0f5> #<产品:0x51f21c50> #<产品:0x6e20f237> #<产品:0x34fe315d> #<产品:0x1c5aebd9> #<产品:0x1532021a> #<产品:0x62803d5> #<产品:0x2d13981b> #<产品:0x61672bbb> #<产品:0x3c6833f2> #<产品:0x5d2a73d9> #<产品:0xe1bdb58> #<产品:0x46dd75a4> # <产品:0x75568654> #<产品:0x38d30fb> #<产品:0x2a8ab08f> #<产品:0x774d921a> #

#<产品:0x348dcd5d> #<产品:0x49a5af9f> #<产品:0x1cad157f> #<产品:0x275e538e> #<产品:0x21bfa3d3> #<产品:0x2c9c82f4> #<产品:0x5759780d> #<产品:0x32d8ca48> – Fallion 2010-11-18 19:58:53

+0

为'Products'类添加'to_s'方法。当你试图用'puts'显示它时,它控制了你的类的一个实例的表示。 'def to_s; “产品:#{@name.nil?'未命名':@name}”;结束' – mikej 2010-11-18 20:26:26

1

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

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

正如您可能注意到的,我对您的语法做了一些调整。我将产品类更改为产品,因为它只跟踪一种产品。然后我也将数组名称从新产品更改为新产品,因为这实际上是存储不同产品的地方。

之后,你有一个数组对象,你可以执行你的sort_by任务。

+0

谢谢,这工作完美。 – Fallion 2010-11-25 18:04:16