6
votes

Comment puis-je forcer des citations doubles lors de la dumping Yaml?

J'ai un petit script pour automatiser certaines choses dans les fichiers YAML.

J'ai lu le fichier YAML d'origine et le convertir en hachage puis Dump au fichier après la modification: P>

File.open(output_file, "w") do |out|
  YAML.dump(modified_hash, out)
end


5 commentaires

Les citations facultatives sont comme, l'une des trois grandes différences de Yaml à JSON. Le troisième est une nuisance attrayante et vous ne l'utilisez probablement pas. Peut-être que vous pourriez juste Json?


Non, malheureusement, je suis obligé d'utiliser Yaml. J'allais aussi bien avec un outil externe qui ajoute les citations automatiquement


JSON est un sous-ensemble YAML (entièrement pour YAML 1.2, pratiquement entièrement pour les versions antérieures).


Vous devez probablement utiliser un émetteur personnalisé psych. Voir aussi psych :: nœuds :: scalaire et psych :: gestionnaire # scalaire.


Actuellement, j'ai l'idée d'ajouter des symboles étranges qui sont peu susceptibles d'utiliser (comme "☙") à chaque valeur et de marcher ultérieurement dans le fichier déversé et de remplacer ces symboles avec une chaîne vide. Ce serait une méthode étrange, mais cela fonctionnera probablement pour ajouter des citations autour des valeurs.


3 Réponses :


0
votes

J'ai trouvé une solution, c'est bizarre, mais ça marche.

forcer citations simples , j'ai traversé le hachage et l'annexe "foobar" (notez l'espace) à chaque valeur. Après avoir utilisé yaml.dump , j'ai ouvert le fichier à nouveau et remplacé "foobar" avec une chaîne vide.

Pour forcer Double citations , j'ai trouvé que Ajout "foo \ nbar" fait le travail. Encore une fois, j'ouvre ensuite le fichier et remplacer "foo \\ nbar" avec la chaîne vide. Weird, mais fonctionne.

Notez que vous voulez probablement choisi quelque chose de moins probable utilisé que FOOBAR.


0 commentaires

0
votes

Voici une version rubis de la réponse de @ Jomo, pour la référence future de toute personne: xxx

Il charge la YAML à partir d'un fichier, ajoute récursivement la chaîne de citation magique à toutes les valeurs d'un objet YAML , puis décharge que Yaml vers le même fichier, puis utilise sed pour supprimer les occurrences de la chaîne magique du fichier de sortie.


0 commentaires

2
votes

Cela fonctionne assez bien. Je l'ai eu de ici

require 'psych'

ast = Psych.parse_stream DATA.read

# First pass, quote everything
ast.grep(Psych::Nodes::Scalar).each do |node|
  node.plain  = false
  node.quoted = true
  node.style  = Psych::Nodes::Scalar::DOUBLE_QUOTED
end

# Second pass, unquote keys
ast.grep(Psych::Nodes::Mapping).each do |node|
  node.children.each_slice(2) do |k, _|
    k.plain  = true
    k.quoted = false
    k.style  = Psych::Nodes::Scalar::ANY
  end
end

puts ast.yaml


1 commentaires

Pour quelqu'un d'autre qui a besoin de passer des options sur ast.yaml , comme la largeur de la ligne, transmettez-les comme le deuxième argument: ast.yaml (nil, {line_width: -1}) (voir ruby-doc.org/stdlib-2.7.2/libdoc/psyss /rdoc/psych/nodes/... )