2014-04-01 30 views
0

我即将写我自己的,但如果有任何宝石/我可以作为聚合器/直方图使用Ruby的优化实现直方图/聚合的

我的目标是要总结以价值为基础的库我想知道上的匹配关键字:

["fish","2"] 
["fish","40"] 
["meat","56"] 
["meat","1"] 

应该总结OP值每唯一键和返回["fish","42"]["meat","57"] .The文件我已经聚集是比较大的,大约由TSV键/值对 4GB的文本文件。我的目标是尽量不要使用临时文件,以免占用太多所以我想知道如果类似的已经优化已经存在,我已经找到了一个名为'直方图'的github jeb,但它并不真正包含我需要的功能 Thx

回答

1

您可以使用哈希使用默认值0进行计数,然后最终可以将其转换为数组以产生所需的格式,但我认为您可能只想继续使用哈希值。

data = [ 
    ["fish","2"], 
    ["fish","40"], 
    ["meat","56"], 
    ["meat","1"] 
] 

hist = data.each_with_object(Hash.new(0)) do |(k,v), h| 
    h[k] += v.to_i 
end 

hist # => {"fish"=>42, "meat"=>57} 
hist.to_a # => [["fish", 42], ["meat", 57]] 
# To get String values, "42" instead of 42, etc: 
hist.map { |k,v| [k, v.to_s] } # => [["fish", "42"], ["meat", "57"]] 

由于您声明您必须从文件中读取数据,因此以下是应用于文件的上述内容。所述input.txt文件内容是用于本实施例中,如下所示:

fish,2 
fish,40 
meat,56 
meat,1 

然后,向通过线阅读它线之前创建相同的输出:

file = File.open('input.txt') 

hist = file.each_with_object(Hash.new(0)) do |line, h|  
    key, value = line.split(',') 
    h[key] += value.to_i 
end 

file.close 
+0

变化只是'42'到'“42” '''57'到''57''等 –

+0

我注意到他提到了字符串作为返回值,但由于它们是数字,我想他可能实际上想要Fixnums,所以我就这样离开它) –

+0

如果是这样的话,我会减少我的代码..就是这个原因..我的一个人得到了这么长的时间:-) –