前回(キーブレイク処理を簡潔に書きたい - Toolbox)に引き続き、keybreakモジュールについて。
キーごとに数値を集計するサンプル。
件数カウントとほとんど同じ。
require "keybreak" RECORDS =<<EOD a 1 b 2 b 3 c 4 c 5 c 6 d 7 e 8 e 9 EOD Keybreak.execute_with_controller do |c, sum| c.on(:keystart) {sum = 0} c.on(:keyend) {|key| puts "#{key}:#{sum}"} RECORDS.each_line do |line| key, value = line.split("\t") c.feed(key) sum += value.to_i end end
キーが入れ子で、子キー単位の小計と親キー単位の合計を出力するサンプル。
require "keybreak" RECORDS =<<EOD a a1 1 b b1 2 b b2 3 c c1 4 c c1 5 c c2 6 d d1 7 e e1 8 e e1 9 EOD c = Keybreak::Controller.new sub_c = Keybreak::Controller.new sum = 0 c.on(:keystart) {sum = 0} c.on(:keyend) do |key| sub_c.flush puts "total #{key}:#{sum}" end sub_sum = 0 sub_c.on(:keystart) {sub_sum = 0} sub_c.on(:keyend) do |key| puts "#{key}:#{sub_sum}" sum += sub_sum end c.execute do RECORDS.each_line do |line| key, sub_key, value = line.split("\t") c.feed(key) sub_c.feed(sub_key) sub_sum += value.to_i end end