我的文件有很多包含文字和数字的行。每个文件中的文本保持不变,但数字会发生变化。 (这是运行数据,所以行是“ - 活动持续时间28:19, - 总距离3.66mi。”等。)
我想要做的是在这些行中找到各个数字,然后创建我自己的输出,例如:“#{time}中的Ran#{distance}”
我能够使用正则表达式在行中找到这些数字,但我无法弄清楚如何获取这些值并将它们变成自己的字符串。我甚至不确定正则表达式是正确的方法。我一直在运行这样的事情:
if line =~/\d*\.\d*/
found completed = true
但后来我不确定接下来会发生什么。
我希望我很清楚 - 并提前感谢你的帮助。
答案 0 :(得分:2)
您可以在元素引用中使用正则表达式来获取数字数据。例如:
2.0.0-p0 :010 > distance = line[/\d*\.\d*/]
=> "3.66"
2.0.0-p0 :011 > time = line[/\d*:\d*/]
=> "28:19"
2.0.0-p0 :012 > puts "Ran #{distance} in #{time}"
Ran 3.66 in 28:19
=> nil
答案 1 :(得分:1)
你可以这样做:
rawlines = <<EOF
- Active Duration 28:19, - Total distance 3.66mi.
- Active Duration 25:12, - Total distance 3.66mi.
- Active Duration 24:10, - Total distance 3.66mi.
- Active Duration 28:21, - Total distance 3.66mi.
- Active Duration 27:19, - Total distance 3.66mi.
EOF
rawlines.scan(/Active Duration (\d++:\d++), - Total distance (\d++(?>\.\d++)?)/) do |dur, dist|
puts "Ran #{dist} in #{dur}\n"
end
答案 2 :(得分:1)
更新了对文件显示迭代的答案。
我将结果放入哈希值,以便键值对可用于操作数据。可以为测量单位添加新密钥等。
<强> runData_20130620.txt 强>
- 活动时间09.87, - 总距离100.0m
- 活动持续时间15:19, - 总距离4.98km
- 活动时间03:00, - 总距离1.0英里
- 活动持续时间21:14, - 总距离3.68, - 生产5.99加仑
- 活动持续时间22:31, - 总距离3.65mi
<强>代码强>
File.foreach("runData_20130620.txt") do |line|
# Create hash, parsing string with regex pattern
runData = Hash[*line.scan(/([^, \-]\D*) (\d*[.:]\d*)/).to_a.flatten]
# This will convert the string keys to symbols, replacing white-space with
# underscores and downcasing
runData = Hash[runData.map { |k,v|
[k.gsub(/\s+/, "_").downcase.to_sym, v] }]
# display results
#runData.each { |k,v| puts "#{k} ** #{v}" }
# display using hash symbol access...
puts "\nRan a distance of #{ runData[:total_distance]} in
runData[:active_duration]} "
puts "Man, I am unfit!" if runData[:sweat_produced]
end
<强>结果
09.87
跑完100.0的距离在15:19中跑了4.98的距离
在03:00跑完1.0的距离
在21:14中跑出3.68的距离 伙计,我不合适!
在22:31中跑了3.65的距离