2013-04-29 63 views
1

我正在讀取一個文件並讀取它的內容並根據換行符創建一個散列。我已經能夠根據每一行的內容製作散列表,但是如何在下一個空白換行符之前根據所有內容創建散列表?以下是我到目前爲止。從一個文件中取多行並創建散列

輸入:

Title 49th parallel 
URL  http://artsweb.bham.ac.uk/ 
Domain artsweb.bham.ac.uk 

Title ABAA booknet 
URL  http://abaa.org/ 
Domain abaa.org 

代碼:

File.readlines('A.cfg').each do |line| 
    unless line.strip.empty? 
    hash = Hash[*line.strip.split("\t")] 
    puts hash 
    end 
    puts "\n" if line.strip.empty? 
end 

輸出:

{"Title"=>"49th parallel"} 
{"URL"=>"http://artsweb.bham.ac.uk/"} 
{"Domain"=>"artsweb.bham.ac.uk"} 

{"Title"=>"ABAA booknet"} 
{"URL"=>"http://abaa.org/"} 
{"Domain"=>"abaa.org"} 

所需的輸出:

{"Title"=>"49th parallel", "URL"=>"http://artsweb.bham.ac.uk/", "Domain"=>"artsweb.bham.ac.uk"} 

{"Title"=>"ABAA booknet", "URL"=>"http://abaa.org/", "Domain"=>"abaa.org"} 
+0

你的問題是矛盾的。你有空格分隔''域名''和它的值,而在你的代碼中你用'「\ t」'分隔。所以你不應該能夠得到你所聲稱的輸出。 – sawa 2013-04-29 18:49:28

+0

@sawa我認爲很明顯,輸入文件實際上是製表符分隔的,並且它不能在複製和粘貼之後存活。切換回標籤,我得到了聲稱的確切輸出。 – 2013-04-29 18:56:28

+0

@sawa鑑於輸出,它非常清楚。你似乎在推測OP在說謊。 – 2013-04-29 19:03:27

回答

1

修改現有的代碼,這你想要做什麼:

hash = {} 
File.readlines('A.cfg').each do |line| 
    if line.strip.empty? 
    puts hash if not hash.empty? 
    hash = {} 
    puts "\n" 
    else 
    hash.merge!(Hash[*line.strip.split("\t")]) 
    end 
end 

puts hash 

你可以很可能簡化取決於你實際的數據做什麼。

0

讀取使用讀取文件的全部內容:

contents = "" 
File.open('A.cfg').do |file| 
    contents = file.read 
end 

然後兩個換行符拆分內容:

contents.split("\n\n") 

最後,創建一個功能非常類似於你已經解析那些塊。

請注意,如果您正在使用Windows,可能會因爲回車符而需要分割不同的序列。

+1

如果您擔心兼容性問題,請使用'$ /',而不是'「\ n」'。 – sawa 2013-04-29 18:33:05

+0

@sawa我從來沒有見過這個。你能指點我到哪裏我可以讀到它的用法? – 2013-04-29 18:39:17

+1

@sawa謝謝你的鏈接。我沒有意識到你正在接受預定義的可信任,我認爲這是我不知怎麼錯過的一些正則表達式魔法。 – 2013-04-29 19:00:05

1
open('A.cfg', &:read) 
.strip.split(/#$/{2,}/) 
.map{|s| Hash[s.scan(/^(\S+)\s+(\S+)/)]} 

[ 
    { 
    "Title" => "49th", 
    "URL" => "http://artsweb.bham.ac.uk/", 
    "Domain" => "artsweb.bham.ac.uk" 
    }, 
    { 
    "Title" => "ABAA", 
    "URL" => "http://abaa.org/", 
    "Domain" => "abaa.org" 
    } 
] 
+0

從這裏學到的新東西。 – 2013-04-29 18:57:27

相關問題