0

我正要自己写,但我想知道是否有任何宝石/库可以用作聚合器/直方图

我的目标是根据匹配键总结值:

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

应该对每个唯一键的值求和并返回["fish","42"]["meat","57"] 。我必须聚合的文件比较大,大约 4gb 由 tsv 键/值对组成的文本文件。我的目标是尽量不使用临时文件,以免太机器上有很多空间,所以我想知道是否已经存在类似已经优化的东西,我在 github 上找到了一个名为“histogram”的 jeb,但它并没有真正包含我需要的功能 Thx

4

1 回答 1

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
于 2014-04-01T15:11:56.320 回答