2012-11-09 13 views
15

Ho un tale file YAML:come posso leggere un file YAML?

Company1: 
    name: Something1 
    established: 2000 
# 
Company2: 
    name: Something2 
    established: 1932 

la lettura del file YAML: (** UPDATE **)

config = YAML.load_file('file.yaml') 
    config.each do |key, value| 
    if(key == 'name') 
     company_name = value 
     #year = config['Company1']['established'] 
     year = config.fetch(key)['established'] 
    end 
    end 

** UPDATE ** Ora il codice di cui sopra sta lavorando, ma è mostra il risultato come:

company1 => {"name" => "something1"} => {"established year" => 2000"} 

come posso rimuovere il {} e ""?

+0

Ho scritto una risposta dettagliata, ma ho visto la risposta di Mori entrare. Questa risposta è probabilmente tutto ciò che devi sapere. A causa della mancanza di rientro nel tuo file YAML visualizzato, stavi semplicemente riassegnando la chiave (che deve essere unica) nello stesso Hash, e quindi vedevi questo comportamento. – vgoff

+0

Apprezzo che tu mi possa aiutare con uno snippet di codice, ho ancora il problema. – newbi

+0

Con ciò che hai imparato finora, dalle risposte date, puoi mostrare le tue modifiche e questo ci aiuterà ad aiutarti vedendo dove stai andando male. – vgoff

risposta

4

YAML uses indentation for scoping, in modo da provare, per es .:

Company1: 
    name: Something1 
    established: 2000 

Company2: 
    name: Something2 
    established: 1932 
+0

Quindi posso ottenere l'anno stabilito usando questo 'year = config .fetch ('established') '? – newbi

+0

Immagino che dovresti andare a config ['Company1'] ['established'] come Company1 e Company2 sono solo chiavi in ​​un hash. – Anton

+0

ma questo finisce con 'metodo non definito' [] 'per nil: NilClass (NoMethodError) ' – newbi

27

Okay, quindi questo è un vostro diritto file YAML?

Company1: 
    name: Something1 
    established: 2000 

Company2: 
    name: Something2 
    established: 1932 

Okay ora questo file YAML rappresenta in realtà un hash. L'ha ha due chiavi: Azienda1, Azienda2 (perché sono le voci principali e le voci secondarie (nome e stabilito) sono rientrate sotto di esse). Il valore di queste due chiavi è di nuovo un Hash. Questo hash ha anche 2 chiavi, vale a dire il nome e stabilito. E hanno valori come Something1 e il 2000, rispettivamente, ecc

Così, quando lo fai,

config=YAML.load_file('file.yml') 

e di configurazione di stampa (che è un hash che rappresenta il contenuto del file YAML) utilizzando,

puts config 

ottieni l'output seguente:

{"Company1"=>{"name"=>"Something1", "established"=>2000}, "Company2"=>{"name"=>"Something2", "established"=>1932}} 

Quindi abbiamo un oggetto hash come descritto da YAML file.

L'utilizzo di questo hash è piuttosto semplice.

Dal momento che il nome e l'anno di ciascuna società sono racchiusi in un hash separato detenuto dall'hash esterno (società1, società2), è possibile scorrere le società. Il seguente codice stampa l'hash.

config.each do |company,details| 
    puts company 
    puts "-------" 
    puts "Name: " + details["name"] 
    puts "Established: " + details["established"].to_s 
    puts "\n\n" 
end 

Quindi in Ogni iterazione otteniamo l'accesso a ciascuna (chiave, valore) dell'Hash. Questo a prima iterazione abbiamo company (chiave) come Company1 e details (value) come {"name"=>"Something1", "established"=>2000}

Spero che questo ha aiutato.

+0

LOL, questo era abbastanza vicino alla prima risposta che ho iniziato, dalla lettura della domanda come era originariamente, e ho visto la prima risposta. Così ci ho pensato e ho cancellato la mia risposta, dato che erano solo troppe informazioni fornite. Ora, dopo l'andata e il ritorno, scoprendo che in effetti la domanda poneva solo una serie di dubbi. Questa risposta è ora appropriata. Quindi ottieni un preventivo da me. E, si spera, risposta accettata. La domanda dovrebbe essere: Come faccio a leggere da YAML e come utilizzo l'hash nidificato risultante: – vgoff

Problemi correlati