Ruby: превращение списка CSV в отдельные объекты - PullRequest
1 голос
/ 18 ноября 2010

Я новичок в 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 ]

2 голосов
/ 18 ноября 2010

Вероятно, самое простое, что нужно сделать, это создать список, а затем, когда вы создаете каждый новый продукт, вы просто помещаете его в список.Затем вы можете использовать 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 голос
/ 18 ноября 2010

Конечно, есть много способов решить задачу, которую вам дали, и я не думаю, что вы так далеки от работоспособного решения.Если вы просто убедитесь, что действительно сохраняете класс Products при его создании, у вас есть список, с которым вы можете работать.

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

Как вы можете заметить, я немного изменил ваш синтаксис.Я изменил класс Products на Product, поскольку он отслеживает только один продукт.Затем я также изменил имя массива с newproduct на newproducts, поскольку именно там будут храниться различные продукты.

После этого у вас есть объект массива, с которым вы можете выполнять свои задачи sort_by.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...