从文件中获取多行并创建哈希

时间:2013-04-29 17:58:54

标签: ruby hash

我正在读取文件并读取其内容并根据换行创建哈希。我已经能够根据每一行的内容制作一个哈希,但是如何在下一个空白换行符之前根据所有内容创建一个哈希?以下是我到目前为止的情况。

输入:

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"}

3 个答案:

答案 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,可能会因为回车符而需要拆分不同的序列。