我目前正在尝试编写一个小脚本来解析每周报告(电子邮件)并将我想要的数据存储在变量中,以便我可以进一步处理它们。
这项功能已经开始运作了,但此刻它已经被黑了,我想了解代码应该如何理想。
这是我目前的代码 - 我将其缩短了一点,使其更通用:
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
有人能帮助我吗?
答案 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的建议。