我有以下格式的Coffeescript文件。我必须使用:::生成所有可能的组合。我已经编写了组合代码。它工作正常。但是,不知何故配置文件已更改&我必须修改该代码。那么,有人可以帮我解决这个问题吗?
abTests:
productRanking:
version: 4
groups: [
ratio:
default: 1
us: 0.90
me: 0.0
value: "LessPopularityEPC"
,
ratio:
default: 0
us: 0.1
value: "CtrEpcJob"
,
ratio:
default: 0
me: 1.0
value: "RandomPerVisitor"
]
我希望将数据格式化为以下格式:
productRanking:
"LessPopularityEPC"
"CtrEpcJob"
"RandomPerVisitor"
]
我在这里使用以下代码:
START_REGEXP = /# AB Tests/
END_REGEXP = /# Routes/
COMMENT_EXP = /#/
COMMA_REGEXP = /,/
START_BLOCK = /\[/
END_BLOCK = /]/
def Automate_AB_tests.abTestParser(input_file,output_file)
raise "Source File doesn't exist at provided path" unless File.exists?(input_file)
flag = false #setting default value of flag=FALSE to parse the data between two REGEX
File.open(output_file, "w") do |ofile| #opening destination file in WRITE mode
File.foreach(input_file) do |iline| #Reading each lines of source file
flag = true if iline =~ START_REGEXP
ofile.puts(iline.sub(" ", '').sub("value:",'')) if flag && (iline =~ /value/ || iline=~ /,/ || iline =~ /]/) unless (iline =~ COMMENT_EXP or iline =~ COMMA_REGEXP)
flag = false if iline =~ END_REGEXP
end
end
end
答案 0 :(得分:0)
假设您想要的是在abTests
下获取每个密钥,例如ProductRanking
,并在第一个value
中返回带有group
键值的密钥的散列,然后如下:
data['abTests'].each_with_object({}) do |(key, testData), resultingHash|
resultingHash[key] = testData['groups'].first['value']
end
但是,如果那个不你想要什么,那么你需要更清楚一些。尝试完成您想要在纸上实现的操作,并逐步分解您的思维过程。处理列表或哈希数据时往往最有用的两个操作是map
和reduce
(each_with_object
是一种减少形式)。查看the Enumerable module of Ruby的文档以获取更多信息。
答案 1 :(得分:0)
假设您有一个ruby哈希值,可以重写为
data = {:abTests=>{:productRanking=>{:version=>4, :groups=>[{:ratio=>{:default=>1, :us=>0.9, :me=>0.0}, :value=>"LessPopularityEPC"}]}}}
您可以遍历此数据哈希以获得所需的结果
例如:
result_hash = {}
data[:abTests].each do |key, value|
result_hash = {k.to_sym => value[:groups][0][:value]}
puts result_hash
end
puts result_hash[:productRanking] //outputs "LessPopularityEPC"