【问题标题】:Ruby Extracting an array of numerical data from a stringRuby 从字符串中提取数值数据数组
【发布时间】:2014-05-09 12:53:20
【问题描述】:

我有一个应用程序从提要中获取以下格式的内容字符串

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”甚至“high: 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"

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

我如何检查以确保传入的数据的清洁度,以确保逗号中的值转换为小数点,例如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]

【问题讨论】:

    标签: ruby arrays regex string


    【解决方案1】:

    你可以这样做:

    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"
    

    【讨论】:

    • 您的答案在提取数据方面效果很好,这就是我将问题标记为已关闭的原因。但是如何解析数据以获取数组中的实际数据,就像我在编辑中尝试做的那样?
    【解决方案2】:

    如果定界逗号后面肯定有空格,首先要去掉逗号作为小数分隔符的作用:

    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'
    

    给你。

    【讨论】:

    • 我只是在 irb 上运行最后一个方法,它返回一个错误 ** NoMethodError: undefined method `+' for nil:NilClas **
    • 我使用了这个数据集 s="昨天:136.00,当前:143.00,变化:+7.00,change_2:5.15%,高:143.00,低:143.00"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多