微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby – 从类似CSV的文件创建哈希

我有一个产品文件,列出了商品#,产品和价格.我想阅读这个文件,并将其初始化为哈希,项目#是关键,产品和价格是价值.这是我的档案

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"]

解决方法

我将您的数据保存为名为products.csv的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",211=>["Shirts",245=>["Hats",689=>["Coats",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 ]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐