A Micro Toolbox

ソフトウェアのニッチな問題の対処記録です

Keybreakモジュールによるキーブレイク処理サンプル(集計)

前回(キーブレイク処理を簡潔に書きたい - 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