我有一個文本文件,我想從中創建一個散列以加快訪問速度。我的文本文件是格式(空格分隔)初始化紅寶石散列問題
author title date popularity
我想創建一個散列,其中作者是關鍵,其餘是值作爲數組。
created_hash["briggs"] = ["Manup", "Jun,2007", 10]
在此先感謝。
我有一個文本文件,我想從中創建一個散列以加快訪問速度。我的文本文件是格式(空格分隔)初始化紅寶石散列問題
author title date popularity
我想創建一個散列,其中作者是關鍵,其餘是值作爲數組。
created_hash["briggs"] = ["Manup", "Jun,2007", 10]
在此先感謝。
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
。請注意0將整個文件讀取到一個數組第一個。所以,你需要足夠的內存來保存整個數組和整個哈希。 (當然,只要循環結束,該陣列將有資格進行垃圾回收。)
只是循環遍歷文件的每一行,請使用第一個空格分隔的項作爲散列鍵,其餘部分作爲散列值。幾乎完全如您所述。
created_hash = {}
file_contents.each_line do |line|
data = line.split(' ')
created_hash[data[0]] = data.drop 1
end
我這樣做了..想知道是否有更快的方法導致文件通常有很多行。 IO.readlines可以容納所有數據,每個數值代表一條線。無論如何,有一種簡單的方法可以將這一步映射到散列而不需要迭代。謝謝。 – 2010-06-09 22:15:54
+1用於對象#tap – 2010-06-10 08:31:14