将Yaml转换为Ruby哈希时,如何区分具有相同键的条目

时间:2013-08-27 13:54:33

标签: ruby hash yaml

我有一个yaml文件,其中包含与此类似的条目。条目表示数据库的更改集,密钥是数据库名称。需要重复项,因为可能会对按特定顺序发生的数据库进行多处更改。

exampleName:
  user: user
  version: 1
  artifact: example1
  order: 1
exampleName:
  user: user
  version: 1
  artifact: example2
  order: 4
aName:
  user: user2
  version: 12
  artifact: example3
  order: 3

我希望能够通过名称和工件来区分它们,以便识别exampleName的两个实例。但是当我使用YAML :: load_file时,由于它们具有相同的密钥,所以只有最后一个密钥保留在哈希中,而另一个密钥丢失。在将yaml加载到哈希中时,是否有关键是名称和工件的组合,或者我需要手动解析yaml。我发现了一个模糊相关的问题。

In Ruby, how to be warned of duplicate keys in hashes when loading a YAML document?

似乎我可能不会这样想,但任何解决方法都会很棒。

2 个答案:

答案 0 :(得分:0)

如果您能够更改Yaml文件的生成方式,或者您能够对其进行适当的预处理,则可以创建一个包含多个Yaml documents的文件。它看起来像这样:

exampleName:
  user: user
  version: 1
  artifact: example1
  order: 1
---
exampleName:
  user: user
  version: 1
  artifact: example2
  order: 4
---
aName:
  user: user2
  version: 12
  artifact: example3
  order: 3

请注意每个文档如何与---分开。

您现在可以使用YAML.load_stream解析此问题,这将为您提供一系列哈希值:

YAML.load_stream File.read('./your_yaml_file.yaml')

结果将是:

[{"exampleName"=>
   {"user"=>"user", "version"=>1, "artifact"=>"example1", "order"=>1}},
 {"exampleName"=>
   {"user"=>"user", "version"=>1, "artifact"=>"example2", "order"=>4}},
 {"aName"=>
   {"user"=>"user2", "version"=>12, "artifact"=>"example3", "order"=>3}}]

答案 1 :(得分:0)

Psych后面有YAML::load解析器/ AST构建器。

如果我像你一样被迫使用“腐败的”YAML,我会看看Psych::TreeBuilder课程。我会将其子类化并重新实现scalar方法。我从来没有这样做,但它看起来是正确的方式。既然你被问到了任何建议,就在这里。

希望它有所帮助。