2017-01-23 24 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 

「VAR」の文字列としてすべての値を含める必要があります。しかし、私はそれがエラーを投げているので、上記の作品を実行することはできません。 YAMLのすべての値を個別に解析するにはどうすればよいですか?

+0

の可能性のある重複(http://stackoverflow.com/questions [どのように私はYAMLファイルを解析しますか?]/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"]] 

代替

まず、あなたはしないように試してみてください毎回同じ変数をオーバーライドします(machines)。これは「シャドーイング」と呼ばれ、コードを理解して使用するのが難しくなります。

あなたが何をしたいのかに応じて、eachmapまたは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

私はsample.sh、:args => [p hash ['ip']]としているbashスクリプトに各値を渡す方法を説明しますが、動作しません。 – Learner

関連する問題