读取文本文件,解析它,并将其存储到哈希中.如何



我想打开一个三行的文本文件

3 台电视,722.49

1箱鸡蛋,价格为14.99

2双鞋,价格为34.85

并把它变成这样:

hash = {
      "1"=>{:item=>"televisions", :price=>722.49, :quantity=>3},    
      "2"=>{:item=>"carton of eggs", :price=>14.99, :quantity=>1},
      "3"=>{:item=>"pair of shoes", :price=>34.85, :quantity=>2}
       }

我很不确定如何去做这件事。这是我到目前为止所拥有的:

f = File.open("order.txt", "r")
lines = f.readlines
h = {}
n = 1
while n < lines.size
lines.each do |line|
  h["#{n}"] = {:quantity => line[line =~ /^[0-9]/]}
  n+=1
end
end

没有理由让这么简单的东西看起来很丑!

h = {}
lines.each_with_index do |line, i|
  quantity, item, price = line.match(/^(d+) (.*) at (d+.d+)$/).captures
  h[i+1] = {quantity: quantity.to_i, item: item, price: price.to_f}
end
File.open("order.txt", "r") do |f|
  n,h = 0,{}
  f.each_line do |line|
    n += 1
    line =~ /(d) (.*) at (d*.d*)/
    h[n.to_s] = { :quantity => $1.to_i, :item => $2, :price => $3 }
  end
end
hash = File.readlines('/path/to/your/file.txt').each_with_index.with_object({}) do |(line, idx), h|
  /(?<quantity>d+)s(?<item>.*)sats(?<price>d+(:?.d+)$)/ =~ line
  h[(idx + 1).to_s] = {:item => item, :price => price.to_f, :quantity => quantity.to_i}
end

我不了解 ruby,所以请随时忽略我的答案,因为我只是根据文档做出假设,但我想我会提供一个非正则表达式解决方案,因为在这种情况下它似乎有点矫枉过正。

我假设您可以使用line.split(" ")并将位置[0]分配给数量,位置[-1]分配给价格,然后将项目分配给[1..-3].join(" ")

根据我能找到的第一个红宝石控制台:

test = "3 telev­isions at 722.4­9"
foo = test.­split(" ")
hash = {1=>{:item=>foo[1..-3]­.join(" "),:q­uantity=>foo[0], :price=>foo[-1]}}
=> {1=>{:item=>"televisions", :quantity=>"3", :price=>"722.49"}}

相关内容

  • 没有找到相关文章