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を手動で解析する必要がありますか? 漠然と関連している 1 つの質問を見つけました。

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 に答える