2010-11-18 5 views
1

Ich bin neu in Ruby und als Teil meiner Studien habe ich eine Aufgabe bekommen, eine CSV-Datei in etwas zu konvertieren, das ich nach Preis und so sortieren kann. Ich habe jedoch Probleme beim Erstellen einer Liste von Objekten. Ich weiß, dass ich object1, object2 und so weiter machen kann, aber ich weiß nicht, wie ich das automatisch machen soll.Ruby: Eine CSV-Liste in separate Objekte umwandeln

Dies ist der Code, den ich bisher habe:

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

Sie sollten sich das FasterCSV-Juwel ansehen. Doing product.split (",") wird nicht mit eingebetteten Kommas umgehen. FasterCSV wird einen breiteren Eingabebereich handhaben. Sonst würde ich dem, was Sie bereits tun, einen sehr ähnlichen Ansatz geben. –

+0

Ich fürchte, meine Schule will, dass wir so etwas schreiben. – Fallion

Antwort

2

Wahrscheinlich ist die einfachste Sache zu tun, um eine Liste zu erstellen, und dann, wenn Sie jedes neue Produkt zu erstellen, können Sie es einfach auf die Liste drücken. Dann können Sie sort_by benutzen, um die Liste zu sortieren, wie Sie wollen.

Also in Ihrem Code haben Sie die Array newproduct, so dass dies nur tun:

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

Wenn Sie nach Preis sortieren möchten:

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

Wie mache ich daraus Namen? Weil die Ausgabe ist. – Fallion

+0

# # # # # # # # # # # # # # # # # # #

# # # # # # # # Fallion

+0

Fügen Sie Ihrer 'Products' Klasse eine' to_s' Methode hinzu. Dies steuert die Darstellung für eine Instanz Ihrer Klasse, wenn Sie versuchen, sie mit 'puts' z. 'def zu_s; "Produkt: #{@name.nil?? 'Unbenannt': @name}"; Ende' – mikej

1

Es gibt natürlich viele Möglichkeiten, zu lösen die Aufgabe, die Sie bekommen haben, und ich glaube nicht, dass Sie so weit von einer praktikablen Lösung entfernt sind. Wenn Sie nur sicherstellen, dass Sie die Produktklasse beim Erstellen tatsächlich speichern, haben Sie eine Liste, mit der Sie arbeiten können.

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

Wie Sie vielleicht bemerken, habe ich ein wenig Anpassung an Ihre Syntax vorgenommen. Ich habe die Klasse Produkte in Produkt geändert, da es nur ein Produkt verfolgt. Dann habe ich auch den Array-Namen von newproduct in newproducts geändert, da dort die verschiedenen Produkte gespeichert werden.

Danach haben Sie ein Array-Objekt, mit dem Sie Ihre sort_by-Aufgaben ausführen können.

+0

Danke, das hat perfekt funktioniert. – Fallion

Verwandte Themen