在Ruby中查找数值,然后将它们转换为字符串

时间:2013-06-19 22:35:18

标签: ruby regex

我的文件有很多包含文字和数字的行。每个文件中的文本保持不变,但数字会发生变化。 (这是运行数据,所以行是“ - 活动持续时间28:19, - 总距离3.66mi。”等。)

我想要做的是在这些行中找到各个数字,然后创建我自己的输出,例如:“#{time}中的Ran#{distance}”

我能够使用正则表达式在行中找到这些数字,但我无法弄清楚如何获取这些值并将它们变成自己的字符串。我甚至不确定正则表达式是正确的方法。我一直在运行这样的事情:

if line =~/\d*\.\d*/
found completed = true

但后来我不确定接下来会发生什么。

我希望我很清楚 - 并提前感谢你的帮助。

3 个答案:

答案 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的距离