2010-06-09 161 views
0

我有一個文本文件,我想從中創建一個散列以加快訪問速度。我的文本文件是格式(空格分隔)初始化紅寶石散列問題

author title date popularity 

我想創建一個散列,其中作者是關鍵,其餘是值作爲數組。

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

在此先感謝。

回答

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。請注意0​​將整個文件讀取到一個數組第一個。所以,你需要足夠的內存來保存整個數組和整個哈希。 (當然,只要循環結束,該陣列將有資格進行垃圾回收。)

+0

+1用於對象#tap – 2010-06-10 08:31:14

1

只是循環遍歷文件的每一行,請使用第一個空格分隔的項作爲散列鍵,其餘部分作爲散列值。幾乎完全如您所述。

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

我這樣做了..想知道是否有更快的方法導致文件通常有很多行。 IO.readlines可以容納所有數據,每個數值代表一條線。無論如何,有一種簡單的方法可以將這一步映射到散列而不需要迭代。謝謝。 – 2010-06-09 22:15:54