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

在Ruby中查找数值,然后将其转换为字符串,ruby,regex,Ruby,Regex,我有一些文件,其中有一堆包含文本和数字的行。每个文件中的文本保持不变,但数字会发生变化。这是正在运行的数据,所以这些线是-活动持续时间28:19,-总距离3.66英里,等等 我想做的是在这些行中定位各个数字,然后创建自己的输出,例如:Ran{distance}in{time} 我能够使用正则表达式在行中找到这些数字,但我不知道如何获取这些值并将它们转换为自己的字符串。我甚至不确定正则表达式是不是正确的方法。我一直在做这样的事情: if line =~/\d*\.\d*/ found comple

我有一些文件,其中有一堆包含文本和数字的行。每个文件中的文本保持不变,但数字会发生变化。这是正在运行的数据,所以这些线是-活动持续时间28:19,-总距离3.66英里,等等

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

我能够使用正则表达式在行中找到这些数字,但我不知道如何获取这些值并将它们转换为自己的字符串。我甚至不确定正则表达式是不是正确的方法。我一直在做这样的事情:

if line =~/\d*\.\d*/
found completed = true
但我不知道接下来会发生什么


我希望我说得很清楚,并提前感谢您的帮助。

您可以在元素引用中使用regex来获取数字数据。例如:

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

您可以在元素引用中使用regex来获取数字数据。例如:

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
你可以这样做:

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
你可以这样做:

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
更新了答案以显示文件上的迭代。我将结果放入散列中,以便可以使用键值对来处理数据。可以为计量单位等添加新键

runData_20130620.txt -有效持续时间09.87,-总距离100.0m -活动持续时间15:19,-总距离4.98公里 -活动持续时间03:00,-总距离1.0英里 -活动持续时间21:14,-总距离3.68,-出汗量5.99加仑 -活动持续时间22:31,-总距离3.65英里

代码

结果

在09.87跑完100.0的距离

以15:19跑了4.98的距离

在03:00跑了1.0的距离

以21:14跑了3.68的距离 伙计,我不适合

以22:31跑了3.65的距离

更新了答案以显示文件上的迭代。我将结果放入散列中,以便可以使用键值对来处理数据。可以为计量单位等添加新键

runData_20130620.txt -有效持续时间09.87,-总距离100.0m -活动持续时间15:19,-总距离4.98公里 -活动持续时间03:00,-总距离1.0英里 -活动持续时间21:14,-总距离3.68,-出汗量5.99加仑 -活动持续时间22:31,-总距离3.65英里

代码

结果

在09.87跑完100.0的距离

以15:19跑了4.98的距离

在03:00跑了1.0的距离

以21:14跑了3.68的距离 伙计,我不适合

以22:31跑了3.65的距离



你能发布一个示例字符串吗?你能发布一个示例字符串吗?看起来很有希望。需要什么吗?现在我得到了“未定义的局部变量或main:objectnamererror的'line'方法”得到了。优雅而有效。谢谢我更喜欢线[/\d+\.\d*/],线[/\d+:\d+/]来扫描唯一出现的模式。我喜欢Arie的添加,它能让事情变得更顺利。看起来很有希望。需要什么吗?现在我得到了“未定义的局部变量或main:objectnamererror的'line'方法”得到了。优雅而有效。谢谢我更喜欢第[/\d+\.\d*/]行,第[/\d+:\d+/]行扫描唯一出现的模式。我喜欢Arie的添加,它可以让事情变得更平滑。你需要修改正则表达式模式-我整理了数据,看起来很有趣!但我如何将其设置为脚本来读取文件中的行呢?例如,myData总是在变化,我不想手工输入所有数据,使用常规构造应该不会太困难。您的文件是否具有指定的格式,即文件中的每一行是否具有相同的结构@craigeleyEach文件包含以下行:-活动持续时间28:19-总距离3.66 惯性矩。给猫剥皮的方法总是不止一种。谢谢您需要修改正则表达式模式-我稍微整理了一下数据,看起来很棒!但我如何将其设置为脚本来读取文件中的行呢?例如,myData总是在变化,我不想手工输入所有数据,使用常规构造应该不会太困难。您的文件是否具有指定的格式,即文件中的每一行是否具有相同的结构@craigeleyEach文件包含以下行:-活动持续时间28:19-总距离3.66 惯性矩。给猫剥皮的方法总是不止一种。谢谢