2013-04-29 73 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

相关问题