2012-11-09 74 views
15

我有这样一个YAML文件:如何读取YAML文件?

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

读取YAML文件:(**更新**)

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 

**更新** 现在上面的代码工作,但它将结果显示为:

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

如何删除{}和“”?

+0

我写了一个详细的答案,但看到森的答案进来。这个答案可能是所有你需要知道的。由于在显示的YAML文件中缺少缩进,因此您只需在同一个哈希中重新分配键(它必须是唯一的),并且您看到了这种行为。 – vgoff

+0

我很感激如果你能帮我一个代码片段,我仍然有问题。 – newbi

+0

用你迄今为止所学到的知识,根据给出的答案,你可以显示你的编辑,这将帮助我们通过看到你的错在哪里来帮助你。 – vgoff

回答

4

YAML uses indentation for scoping,所以尝试,例如:

Company1: 
    name: Something1 
    established: 2000 

Company2: 
    name: Something2 
    established: 1932 
+0

然后我可以使用'year = config .fetch('建立')'? – newbi

+0

我想你应该去配置['Company1'] ['established'],因为Company1和Company2只是散列中的键。 – Anton

+0

但是,这最终以'undefined method'[]'为零:NilClass(NoMethodError)' – newbi

27

好了,这是你的YAML文件吗?

Company1: 
    name: Something1 
    established: 2000 

Company2: 
    name: Something2 
    established: 1932 

好吧,现在这个YAML文件实际上代表了一个哈希。它有两个键,即Company1,Company2(因为它们是主要条目,子条目(名称和已建立)在它们下面缩进)。这两个键的值又是哈希。这个哈希也有2个键,即名称和已建立。他们有类似价值观和Something1分别2000等

所以,当你这样做,

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

和打印配置(这是代表YAML文件内容的散列值)使用,

puts config 

你会得到下面的输出:

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

因此,我们有一个Hash对象由YAML描述文件中。

使用这个哈希非常简单。

由于每个公司的名称和年份都由外部散列(company1,company2)持有的独立散列进行,因此我们可以遍历这些公司。以下代码打印哈希。

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

所以在每次迭代中我们都可以访问哈希的每个(键值)。这在第一次迭代,我们有company(Key)作为Company1details(值){"name"=>"Something1", "established"=>2000}

希望这有助于。

+0

大声笑,这是非常接近我开始的第一个答案,从阅读问题,因为它是最初的,并看到第一个答案。所以我想了想并取消了我的回答,因为这只是给出了太多的信息。在来回之后,发现这个问题确实问了一大堆疑惑。这个答案现在是适当的。所以你从我这里得到了赞赏。希望接受的答案。问题应该是:我如何从YAML中读取数据,以及如何使用生成的嵌套Hash: – vgoff