我有一个文本文件,我想从中创建一个Hash以便更快地访问。我的文本文件是格式(空格分隔)
author title date popularity
我想创建一个哈希,其中author是键,剩下的是值作为数组。
created_hash["briggs"] = ["Manup", "Jun,2007", 10]
提前致谢。
答案 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