2010-11-18 9 views
1

Ruby'de yeniyim ve çalışmalarımın bir parçası olarak CSV dosyasını fiyat ve buna göre sıralayabileceğim bir şeye dönüştürme görevim var. Ancak, bir nesne listesi oluşturmakta sorun yaşıyorum. Ben object1, object2 ve bunu yapabilirim biliyorum, ama bunu otomatik olarak nasıl yapacağımı bilmiyorum. Her yeni ürün oluşturmak zaman, sadece listede üzerine itin, ardındanRuby: Ayrı nesnelere bir CSV listesi döndürme

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 gemine bakmalısınız. Product.split (",") yapmak gömülü virgül gibi şeyleri işlemez. FasterCSV daha geniş bir giriş aralığını işleyecektir. Aksi halde, yaptığınız şeye çok benzer bir yaklaşım benimseydim. –

+0

Korkarım okulum bir başlangıç ​​için böyle şeyler yazmamızı istiyor. – Fallion

cevap

2

yapmak için muhtemelen en kolay şey bir liste oluşturmak için ve:

Bu

var bugüne kadar koddur. Ardından, listeyi sıralamak için sort_by'u kullanabilirsiniz.

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

Eğer fiyata göre sıralamak isterseniz:

newproduct.sort_by{|x| x.price} 
+0

Adlara nasıl dönüştürebilirim? Çünkü çıktı. – Fallion

+0

# <Ürün: 0x1b192059> # <Ürün: 0xe9ac0f5> # <Ürün: 0x51f21c50> # <Ürün: 0x6e20f237> # <Ürün: 0x34fe315d> # <Ürün: 0x1c5aebd9> # <Ürün: 0x1532021a> # <Ürün: 0x62803d5> # <Ürün: 0x2d13981b> # <Ürün: 0x61672bbb> # <Ürün: 0x3c6833f2> # <Ürün: 0x5d2a73d9> # <Ürün: 0xe1bdb58> # <Ürün: 0x46dd75a4> # <Ürün: 0x75568654> # <Ürün: 0x38d30fb> # <Ürün: 0x2a8ab08f> # <Ürün: 0x774d921a> #

# <Ürün: 0x348dcd5d> # <Ürün: 0x49a5af9f> # <Ürün: 0x1cad157f> # <Ürün: 0x275e538e> # <Ürün: 0x21bfa3d3> # <Ürün: 0x2c9c82f4> # <Ürün : 0x5759780d> # <Ürün: 0x32d8ca48> – Fallion

+0

'Ürünler 'sınıfınıza bir' to_s 'yöntemi ekleyin. Bu, 'koyar' ile görüntülemeye çalıştığınızda sınıfınızın bir örneğinin temsilini kontrol eder. def; "Ürün: #{@name.nil?" 'Adsız': @name} "; – mikej

1

elbette birçok yolu vardır çözmek için vardır

Yani kodunuzda, bunu sadece bunu, dizi newproduct var Size verilen görev ve işe yaramaz bir çözümden çok uzak olduğunu düşünmüyorum. Ürünler sınıfını oluştururken Ürün sınıfını gerçekten kaydettiğinizden emin olursanız, birlikte çalışabileceğiniz bir listeniz vardır.

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

Fark edebileceğiniz gibi, sözdiziminize küçük bir ayar yaptım. Ürünü yalnızca bir ürünü takip ettiği için Ürünü değiştirdim. Daha sonra dizi adını yeni ürünlerden yeni ürünlere dönüştürdüm, çünkü farklı ürünlerin depolanacağı yer burası.

Bundan sonra sort_by görevlerinizi gerçekleştirebileceğiniz bir dizi nesnesine sahipsiniz.

+0

Teşekkür ederim, bu mükemmel bir şekilde çalıştı. – Fallion

İlgili konular