1

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

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

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

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

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

我希望我是清楚的 - 并提前感谢您的帮助。

4

3 回答 3

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
于 2013-06-19T22:45:52.423 回答
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.65 英里

代码

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

于 2013-06-20T02:48:28.543 回答
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
于 2013-06-19T23:15:40.290 回答