我有一个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?
似乎我可能不会这样想,但任何解决方法都会很棒。
答案 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
方法。我从来没有这样做,但它看起来是正确的方式。既然你被问到了任何建议,就在这里。
希望它有所帮助。