我想打开一个包含三行的文本文件
3电视722.49
一箱14.99的鸡蛋
两双鞋,分别为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
答案 0 :(得分:9)
没有理由让这些看起来很丑陋!
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
答案 1 :(得分:1)
hash = File.readlines('/path/to/your/file.txt').each_with_index.with_object({}) do |(line, idx), h|
/(?<quantity>\d+)\s(?<item>.*)\sat\s(?<price>\d+(:?\.\d+)$)/ =~ line
h[(idx + 1).to_s] = {:item => item, :price => price.to_f, :quantity => quantity.to_i}
end
答案 2 :(得分:1)
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
答案 3 :(得分:0)
我不知道ruby,所以我可以随意忽略我的答案,因为我只是根据文档做出假设,但我认为我提供了一个非正则表达式的解决方案,因为在这样的情况下它似乎有点过分。
我假设您可以使用line.split(" ")
并将位置[0]
分配给数量,将[-1]
定位到定价,然后将项目分配给[1..-3].join(" ")
根据我发现的第一个红宝石console:
test = "3 televisions at 722.49"
foo = test.split(" ")
hash = {1=>{:item=>foo[1..-3].join(" "),:quantity=>foo[0], :price=>foo[-1]}}
=> {1=>{:item=>"televisions", :quantity=>"3", :price=>"722.49"}}