2

我有一个 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。我发现了一个模糊相关的问题。

在 Ruby 中,如何在加载 YAML 文档时警告哈希中的重复键?

似乎不可能按照我想要的方式进行,但是任何解决方法都会很棒。

4

2 回答 2

1

如果您能够更改 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

请注意每个文档是如何用---.

您现在可以使用 解析它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}}]
于 2013-08-27T14:29:29.877 回答
0

后面有Psych解析器/AST-builder YAML::load

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

希望能帮助到你。

于 2013-08-27T14:44:11.240 回答