如何通过截断数据获得以下结果?

时间:2016-02-18 03:48:28

标签: ruby-on-rails ruby

我有以下格式的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

2 个答案:

答案 0 :(得分:0)

假设您想要的是在abTests下获取每个密钥,例如ProductRanking,并在第一个value中返回带有group键值的密钥的散列,然后如下:

data['abTests'].each_with_object({}) do |(key, testData), resultingHash|
  resultingHash[key] = testData['groups'].first['value']
end

但是,如果那个你想要什么,那么你需要更清楚一些。尝试完成您想要在纸上实现的操作,并逐步分解您的思维过程。处理列表或哈希数据时往往最有用的两个操作是mapreduceeach_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"