Ruby:在哈希创建中插入字符串

时间:2015-05-05 17:24:40

标签: ruby

我目前正在尝试编写一个小脚本来解析每周报告(电子邮件)并将我想要的数据存储在变量中,以便我可以进一步处理它们。

这项功能已经开始运作了,但此刻它已经被黑了,我想了解代码应该如何理想。

这是我目前的代码 - 我将其缩短了一点,使其更通用:

activated_accounts_rx = Regexp.new(/example/)
canceled_accounts_rx = Regexp.new(/example/)
converted_accounts_rx = Regexp.new(/example/)

File.open("weekly_report.txt") do |f|

    input = f.read

    activated_accounts = input.scan(activated_accounts_rx).join
    canceled_accounts = input.scan(canceled_accounts_rx).join
    converted_accounts = input.scan(converted_accounts_rx).join

end

我想到了这样的事情,我知道它无法奏效,但我不知道如何让它发挥作用:

var_names = ["activated_accounts", 
             "canceled_accounts", 
             "converted_accounts"]

regex = { "#{var_names[0]}": Regexp.new(/example/), 
          "#{var_names[1]}": Regexp.new(/example/) }

File.open("weekly_report.txt") do |f|

    input = f.read

    for name in var_names
        name = input.scan(regex[:#{name}]).join
    end

end

我想最终得到这样的变量:

activated_accounts = 13
canceled_accounts = 21
converted_accounts = 5

有人能帮助我吗?

2 个答案:

答案 0 :(得分:3)

您可能不需要为变量设置单独的数组。只需将它们用作哈希中的键即可。然后,您可以稍后从另一个哈希访问这些值。更好的是,如果您不再需要正则表达式,则只需将该值替换为扫描内容即可。

regexHash = { 
              activated_accounts: Regexp.new(/example/), 
              canceled_accounts : Regexp.new(/example/),
              converted_accounts: Regexp.new(/example/)
            }
values = {}

contents = File.open("weekly_report.txt").read
regexHash.each do |var, regex|
  values[var] = contents.scan(regex).join
end

要稍后访问您的值,请使用

values[:var_name] # values[:activated_accounts] for example

答案 1 :(得分:0)

如果您想在数组中使用单独的名称变量,可以使用to_sym

regex = { var_names[0].to_sym => Regexp.new(/example/), 
          var_names[1].to_sym => Regexp.new(/example/) } #Rocket notation!

for name in var_names
    name = input.scan(regex[var_names[0].to_sym]).join
end

无论如何,我更喜欢Rob Wagner的建议。