How to merge YAML arrays?

后端 未结 5 1667
旧时难觅i
旧时难觅i 2020-11-29 23:16

I would like to merge arrays in YAML, and load them via ruby -

some_stuff: &some_stuff
 - a
 - b
 - c

combined_stuff:
  <<: *some_stuff
  - d
  -         


        
5条回答
  •  醉梦人生
    2020-11-30 00:06

    Update: 2019-07-01 14:06:12

    • Note: another answer to this question was substantially edited with an update on alternative approaches.
      • That updated answer mentions an alternative to the workaround in this answer. It has been added to the See also section below.

    Context

    This post assumes the following context:

    • python 2.7
    • python YAML parser

    Problem

    lfender6445 wishes to merge two or more lists within a YAML file, and have those merged lists appear as one singular list when parsed.

    Solution (Workaround)

    This may be obtained simply by assigning YAML anchors to mappings, where the desired lists appear as child elements of the mappings. There are caveats to this, however, (see "Pitfalls" infra).

    In the example below we have three mappings (list_one, list_two, list_three) and three anchors and aliases that refer to these mappings where appropriate.

    When the YAML file is loaded in the program we get the list we want, but it may require a little modification after load (see pitfalls below).

    Example

    Original YAML file

      list_one: &id001
       - a
       - b
       - c
    
      list_two: &id002
       - e
       - f
       - g
    
      list_three: &id003
       - h
       - i
       - j
    
      list_combined:
          - *id001
          - *id002
          - *id003
    

    Result after YAML.safe_load

    ## list_combined
      [
        [
          "a",
          "b",
          "c"
        ],
        [
          "e",
          "f",
          "g"
        ],
        [
          "h",
          "i",
          "j"
        ]
      ]
    

    Pitfalls

    • this approach produces a nested list of lists, which may not be the exact desired output, but this can be post-processed using the flatten method
    • the usual caveats to YAML anchors and aliases apply for uniqueness and declaration order

    Conclusion

    This approach allows creation of merged lists by use of the alias and anchor feature of YAML.

    Although the output result is a nested list of lists, this can be easily transformed using the flatten method.

    See also

    Updated alternative approach by @Anthon

    • See alternative approach

    Examples of the flatten method

    • Javascript flatten ;; Merge/flatten an array of arrays
    • Ruby flatten ;; http://ruby-doc.org/core-2.2.2/Array.html#method-i-flatten
    • Python flatten ;; https://softwareengineering.stackexchange.com/a/254676/23884

提交回复
热议问题