我正在读取文件并读取其内容并根据换行创建哈希。我已经能够根据每一行的内容制作一个哈希,但是如何在下一个空白换行符之前根据所有内容创建一个哈希?以下是我到目前为止的情况。
输入:
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 :(得分: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
根据您对数据的实际操作,您可以简化这一过程。
答案 1 :(得分: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"
}
]
答案 2 :(得分:0)
使用read:
读取文件的全部内容contents = ""
File.open('A.cfg').do |file|
contents = file.read
end
然后将内容拆分为两个换行符:
contents.split("\n\n")
最后,创建一个非常类似于解析这些块的函数。
请注意,如果您正在使用Windows,可能会因为回车符而需要拆分不同的序列。