3 votes

Ruby : Lecture de tableaux de hachage depuis YAML

J'ai deux pères qui entrent dans mon fichier YAML, mais une seule famille en sort. Que s'est-il passé avec Sam ? Comment faire sortir les deux ?

## dads.rb
require 'yaml'
require 'pp'

dad=[]

dad[0] = {:name => "Joe", :kids => ["Mary", "John"]}
dad[1] = {:name => "Sam", :kids => ["Sam Jr", "Samantha", "Samizdat"]}

open('dads.yml' , 'w') do |f|
    dad.each do |d|
        f.write YAML::dump(d)
    end
end

family = []
open('dads.yml') do |f|
    family << YAML::load(f.read)
end

pp fams

7voto

Niklas B. Points 40619

Vous déversez plusieurs documents YAML mais n'en relisez qu'un seul. Au lieu de cela, vous pouvez simplement vider et lire l'ensemble du tableau :

require 'yaml'

dads = []
dads << {:name => "Joe", :kids => ["Mary", "John"]}
dads << {:name => "Sam", :kids => ["Sam Jr", "Samantha", "Samizdat"]}

open('dads.yml', 'w') { |f| YAML::dump(dads, f) }

family = YAML::load(File.read('dads.yml'))

p family

2voto

Dylan Markow Points 65796

Votre code crée actuellement des "documents" séparés dans la sortie YAML. Par défaut, YAML::load va juste lire dans le premier document. La réponse de Niklas est sans aucun doute la meilleure, mais si vous deviez absolument traiter plusieurs documents, vous pourriez utiliser la fonction load_documents méthode :

family = YAML.load_documents(File.read("dads.yml"))
# => [{:name=>"Joe", :kids=>["Mary", "John"]}, {:name=>"Sam", :kids=>["Sam Jr", "Samantha", "Samizdat"]}]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X