我即将自己编写,但我想知道是否有任何可用作聚合器/直方图的宝石/库
我的目标是根据匹配的键总结值:
["fish","2"]
["fish","40"]
["meat","56"]
["meat","1"]
应该对每个唯一键的值进行求和并返回["fish","42"]
和["meat","57"]
我必须聚合的文件相对较大,大约4GB的文本文件由tsv键/值对组成
我的目标是尽量不使用临时文件,以免在机器上占用太多空间,所以我想知道是否已经存在类似已经优化的东西,我在github上发现了一个名为'histogram'的jeb但它没有真的包含我需要的功能
THX
答案 0 :(得分:1)
你可以使用默认值为0的Hash进行计数,最后你可以将它转换为Array以产生你想要的格式,不过我认为你可能只想继续使用Hash。
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