在ruby中初始化哈希的问题

时间:2010-06-09 21:52:08

标签: ruby

我有一个文本文件,我想从中创建一个Hash以便更快地访问。我的文本文件是格式(空格分隔)

author title date popularity

我想创建一个哈希,其中author是键,剩下的是值作为数组。

created_hash["briggs"] = ["Manup", "Jun,2007", 10]

提前致谢。

2 个答案:

答案 0 :(得分:2)

require 'date'

created_hash = File.foreach('test.txt', mode: 'rt', encoding: 'UTF-8').
reduce({}) {|hsh, l|
  name, title, date, pop = l.split
  hsh.tap {|hsh| hsh[name] = [title, Date.parse(date), pop.to_i] }
}

我在那里扔了一些类型转换代码,只是为了好玩。如果您不想这样,循环体变得更简单:

  k, *v = l.split
  hsh.tap {|hsh| hsh[k] = v }

您也可以使用readlines代替foreach。请注意,IO#readlines将整个文件读入数组 first 。因此,您需要足够的内存来容纳整个数组和整个哈希。 (当然,一旦循环结束,该数组将有资格进行垃圾收集。)

答案 1 :(得分:1)

只需循环遍历文件的每一行,使用第一个以空格分隔的项作为哈希键,其余项作为哈希值。几乎就像你描述的那样。

created_hash = {}
file_contents.each_line do |line|
  data = line.split(' ')
  created_hash[data[0]] = data.drop 1
end