Ruby从字符串中提取数值数据

时间:2014-05-09 12:53:21

标签: ruby arrays regex string

我有一个应用程序从Feed

获取具有以下格式的一串内容
b="yesterday: 136.00, current: *143.00*, change: *+7.00*, change_2: *5.15%*, high: 143.00, low: 143.00"

不定期地,Feed可能会返回2014/08/15格式的日期,而不是

这样的数字
b="yesterday: 2014/12/02, current: *143.00*, change: *+7.00*, change_2: *5.15%*, high: 143.00, low: 143.00"

但是,此日期可能会以任何类别返回,例如“change_2:2013/1/21”甚至是“高:2014/11/23”的随机格式。

Feed也可以返回逗号分隔值而不是小数,但实际上它应该是十进制值,例如。

b="yesterday: 136,00, current: *143.00*, change: *+7.00*, change_2: *5,15%*, high: 143.00, low: 143.00"

Feed还可能会返回以下内容:

b="yesterday: 2014/02/12, current: *143,00*, change: *+7.00*, change_2: *5.15%*, high: 143.00, low: 143.00"

请注意,已返回日期和逗号分隔值,并且流返回此数据的顺序完全是随机的。

如何检查以确保传入的数据的清晰度以确保将vales中的逗号转换为小数点,例如23,12至23.13并且返回的任何日期将替换为值0

此问题是由同事发布的this的变体

当我将日期作为第一个值时,aelor的第一个回答会返回以下内容:

 b = ["yesterday: 0", "current: *143.00*", "change: *+7.00*", "change_2: *5.15%*", "high: 143.00", "low: 143.00"]

然后我做了

c = b.split(". ")
d = c.map{ |x| x.scan(/[\d\.-]+/)[0] }.map(&:to_f)

但是d返回

[0.0, 143.0, 7.0, 2.0, 143.0, 143.0]

而不是

[0.0, 143.0, 7.0, 5.15, 143.0, 143.0]

2 个答案:

答案 0 :(得分:0)

你可以这样做:

b="yesterday: 2014/02/12, current: *143,00*, change: *+7.00*, change_2: *5.15%*, high: 143.00, low: 143.00"
anydate = b.scan(/\d{4}\/\d{2}\/\d{2}/)
if !anydate.empty?
  anydate.each {|s| b = b.gsub(s,'0').gsub(",",".")}
else
  b = b.gsub(",",".")
end

检查b

的值
"yesterday: 0. current: *143.00*. change: *+7.00*. change_2: *5.15%*. high: 143.00. low: 143.00"

答案 1 :(得分:0)

如果分隔逗号后面肯定有空格,首先你要删除扮演小数分隔符角色的逗号:

s = "yesterday: 136,00, current: *143.00*, change: *+7.00*, " + \
    "change_2: *5,15%*, high: 143.00, low: 143.00"

s.gsub! /,(?=\S)/, '.'

现在让我们摆脱日期:

s.gsub! /(:\D*)(\d{2,4}[\-\/]\d{2,4}[\-\/]\d{2,4})(?=\D)/, $1+'0'

你走了。