Создать хэш из CSV-подобного файла - PullRequest
3 голосов
/ 23 февраля 2012

У меня есть файл с описанием товара, продуктов и цены. Я хотел бы прочитать этот файл и инициализировать его как хеш с ключом #, а ключом - товары и цена Вот мой файл

199, Shoes, 59.99
211, Shirts, 19.99
245, Hats, 25.99
689, Coats, 99.99
712, Beanies, 6.99

Мне бы хотелось, чтобы это выглядело так.

products = {
  199 =>['Shoes', 59.99],
  211 =>['Shirts', 19.99],
  245 =>['Hats', 25.99],
  689 => ['Coats', 99.99],
  712 => ['Beanies', 6.99]
}

Это то, что я могу придумать, и это не совсем то, чего он хочет.

products_file = File.open("files.txt")
products_hash = []
while ! products_file.eof?
  product_hash = products_file.gets.chomp
  print product_hash.split(', ')
end

А вот вывод, который я придумал:

["199", "Shoes", "59.99"]
["211", "Shirts", "19.99"]
["245", "Hats", "25.99"]
["689", "Coats", "99.99"]
["712", "Beanies", "6.99"]

Ответы [ 2 ]

11 голосов
/ 23 февраля 2012

Я сохранил ваши данные в виде CSV-файла с именем products.csv и сделал это:

require 'csv'
products = {}
CSV.foreach("products.csv") do |line| 
  products[line[0].to_i] = [line[1].strip, line[2].to_f]
end
products
#=> {199=>["Shoes", 59.99], 211=>["Shirts", 19.99], 245=>["Hats", 25.99], 689=>["Coats", 99.99], 712=>["Beanies", 6.99]}

Тот же результат можно получить более кратким способом, используя each_with_object, но он читает весь файлв память сразу, что может быть плохой идеей, если файл большой:

require 'csv'
products = CSV.read("products.csv").each_with_object({}) do |line, h|
  h[line[0].to_i] = [line[1].strip, line[2].to_f]
end 

Существует также более функциональный подход, как первоначально предложил Phrogz:

require 'csv'
products = Hash[ CSV.read('products.csv').map do |row|
  [ row[0].to_i, [row[1].strip,row[2].to_f] ]
end ]
1 голос
/ 24 февраля 2012

Вариант, манипулирующий данными с помощью преобразователей CSV:

require 'csv'
products = {}
CSV.foreach('products.csv', {col_sep: ', ', converters: :numeric}) do |row|
  products[row.shift] = row
end
p products
#=> {199=>["Shoes", 59.99], 211=>["Shirts", 19.99], 245=>["Hats", 25.99], 689=>["Coats", 99.99], 712=>["Beanies", 6.99]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...