2012-11-09 71 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