2017-01-23 5 views
0

У меня есть файл machine.yml следующим образом:как разобрать файл yaml?

--- 
    machines: 
    A: 
     ip: ABC 
     pass: vass 
     user: A 

    B: 
     ip: XYZ 
     pass: grass 
     user: B 

    C: 
     ip: klm 
     pass: pass 
     user: C 

Я пытался разобрать вышеуказанный файл следующим образом:

 machines = YAML.load_file('machine.yml') 
     machines = machines['machines'] 
     ## Iterate through entries in YAML file 
     machines.each_value do |machines| 
      var = [machines["A"]["ip"], machines["A"]["pass"], machines["B"]["ip"],machines["B"]["pass"], machines["C"]["ip"],machines["C"]["pass"]] 
      # var should have all the values 
     end 

В «вар» должен содержать все значения в виде строки. Но я не могу выполнить вышеупомянутый кусок, поскольку он бросает ошибки. Как я могу разобрать все значения YAML отдельно?

+0

Возможный дубликат [? Как разобрать файл YAML] (http://stackoverflow.com/questions/3877004/how-do-i-parse-a-yaml-file) – Bustikiller

+2

Какая ошибка? – Anthon

ответ

3

Ваш код

Поскольку вы жёстко ключи вы заинтересованы, вам не нужно перебирать с each_values:

machines = YAML.load_file('machine.yml') 
machines = machines['machines'] 
var = [machines["A"]["ip"], machines["A"]["pass"], machines["B"]["ip"],machines["B"]["pass"], machines["C"]["ip"],machines["C"]["pass"]] 

Alternative

Во-первых, вы должны стараться не каждый раз переопределять одну и ту же переменную (machines). Это называется «затенение», и это затрудняет понимание и использование вашего кода.

В зависимости от того, что вы хотите сделать, each, map или flat_map может помочь вам:

require 'yaml' 

yaml_hash = YAML.load_file('machine.yml') 
p yaml_hash['machines'] 
#=> {"A"=>{"ip"=>"ABC", "pass"=>"vass", "user"=>"A"}, "B"=>{"ip"=>"XYZ", "pass"=>"grass", "user"=>"B"}, "C"=>{"ip"=>"klm", "pass"=>"pass", "user"=>"C"}} 

yaml_hash['machines'].each do |letter, hash| 
    p letter 
    p hash['ip'] 
    p hash['pass'] 
end 

#=> 
# "A" 
# "ABC" 
# "vass" 
# "B" 
# "XYZ" 
# "grass" 
# "C" 
# "klm" 
# "pass" 

p yaml_hash['machines'].values 
#=> [{"ip"=>"ABC", "pass"=>"vass", "user"=>"A"}, {"ip"=>"XYZ", "pass"=>"grass", "user"=>"B"}, {"ip"=>"klm", "pass"=>"pass", "user"=>"C"}] 

p yaml_hash['machines'].values.map { |hash| hash.values_at('ip', 'pass') } 
#=> ["ABC", "vass"], ["XYZ", "grass"], ["klm", "pass"]] 

p yaml_hash['machines'].values.flat_map { |hash| hash.values_at('ip', 'pass') } 
#=> ["ABC", "vass", "XYZ", "grass", "klm", "pass"] 
+0

как передать каждое значение скрипту bash, я делаю как sample.sh,: args => [p hash ['ip']], но его не работает. – Learner

 Смежные вопросы

  • Нет связанных вопросов^_^