Baies multi-lignes YAML


140

Dans YAML , vous pouvez facilement créer des chaînes multilignes . Cependant, j'aimerais pouvoir créer un tableau multiligne (principalement pour la lisibilité dans les fichiers de configuration) en utilisant le |caractère.

Un YAML réseau peut être représentée comme suit: ['key1', 'key2', 'key3'].

Une séquence YAML utilise un tiret suivi d'un espace puis d'une chaîne:

- String1
- String2
- String3

Ce évaluerait à: ['string1', 'string2', 'string3'].

Un mappage YAML est un tableau de paires de clés et de valeurs que nous voyons tout le temps dans YAML:

Key1: string1
Key2: string2
Key3: string3

Tout cela est bien beau, mais je ne peux pas pour la vie de moi voir comment faire un tableau multiligne. Quelque chose comme ça:

|
['string1', 'string2', 'string3']
['string4', 'string5', 'string6']

À moins de créer plusieurs mappages de tableaux en YAML et de les fusionner dans le langage de programmation de mon choix, y a-t-il un moyen de réaliser des tableaux multi-lignes, peut-être avec { }comme Python mais en YAML?


Honnêtement, qu'est-ce qu'un tableau multiligne et quand devrait-il avoir un sens? Plutôt que juste l'apparence de votre code
OK999

Avoir à faire défiler l'écran horizontalement pour voir toutes les options plutôt que de les voir toutes sur un seul écran à la fois.
Jimbo

Réponses:


241

Une séquence YAML est un tableau . Voici donc la bonne façon de l'exprimer:

key:
  - string1
  - string2      
  - string3
  - string4
  - string5
  - string6

C'est identique dans le sens à:

key: ['string1', 'string2', 'string3', 'string4', 'string5', 'string6']

Il est également légal de diviser un tableau sur une seule ligne sur plusieurs lignes:

key: ['string1', 'string2', 'string3', 
  'string4', 'string5', 
  'string6']

et même avoir des chaînes multilignes dans des tableaux sur une seule ligne:

key: ['string1', 'long
  string', 'string3', 'string4', 'string5', 'string6']

1
est-ce un problème si les chaînes commencent par un - (par exemple les options passées dans la ligne de commande)? dois-je alors citer? `-" -myarg "`?
ekkis

2
Cela dépend totalement du programme que vous utilisez pour analyser le YAML. Cette question concerne uniquement la spécification YAML.
Steve Bennett

39

avez-vous essayé cela?

-
  name: Jack
  age: 32
-
  name: Claudia
  age: 25

J'obtiens ceci: [{"name"=>"Jack", "age"=>32}, {"name"=>"Claudia", "age"=>25}](j'utilise la YAMLclasse Ruby).


6

Ce qui suit fonctionnerait:

myarray: [
  String1, String2, String3,
  String4, String5, String5, String7
]

Je l'ai testé en utilisant l'implémentation snakeyaml, mais je ne suis pas sûr des autres implémentations.


2
cela a fonctionné avec Puppet Enterprise 3.7 hiera yaml (Ruby yaml) une chose que je trouve que ruby ​​yaml est assez sensible aussi est l'identification, et évite d'utiliser des onglets. donc l'exemple ci-dessus devrait être comme dans deux lignes identifiées le même nombre d'espaces où la première ligne est myarray: [String1, String2, String3,et la deuxième ligne est `String4, String5, String5, String7]`
Walid

2

La suite fonctionne pour moi et c'est bon du point de vue de la lisibilité lorsque les valeurs des éléments du tableau sont petites:

key: [string1, string2, string3, string4, string5, string6]

Remarque: implémentation snakeyaml utilisée


0

Si vous avez besoin d'un tableau de tableaux, vous pouvez procéder de cette façon:

key:
  - [ 'value11', 'value12', 'value13' ]
  - [ 'value21', 'value22', 'value23' ]

Merci Vinicius, mais la question énonçait explicitement: ". J'aimerais pouvoir créer un tableau multi-lignes", pas plusieurs lignes de plusieurs tableaux.
Jimbo le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.