0

私は自分自身を書こうとしていますが、アグリゲーター/ヒストグラムとして使用できる宝石/ライブラリがあるかどうか疑問に思っていました

私の目標は、一致するキーに基づいて値を合計することです:

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

一意のキーごとに値を合計して、 を返す必要が["fish","42"]あり["meat","57"] ます。集約する必要があるファイルは比較的大きく、tsv キーと値のペアで構成される約 4 GB のテキスト ファイルです。私の目標は、一時ファイルを使用しないようにすることです。マシン上に多くのスペースがあるので、すでに最適化された同様のものが既に存在するかどうか疑問に思っていました.githubで「ヒストグラム」という名前のジェブを見つけましたが、必要な機能が実際には含まれていませんThx

4

1 に答える 1

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

次に、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 に答える