csvファイルのカラムの要素による集計をするRubyスクリプト

住所録から市(区)毎の合計数を集計するRubyスクリプトのメモ。
csvファイルは、文字コードが utf-8 、改行コードが lf を想定している。

$KCODE = "UTF8"
require "csv"

areas = Hash.new
total = 0
colnum = 4

CSV.open(ARGV[0], "r") {|row|
    address = row[colnum]
    city_name = address.slice(/[^市区]*(|)/)
    unless city_name then
        next
    end

    if areas.key?(city_name) then
        new_count = areas[city_name].to_i + 1
        areas.store(city_name, new_count)
    else
        areas.store(city_name, 1)
    end
    total = total + 1
}

areas.each {|key,val|
    puts "#{key}, #{val}"
}
puts "合計 #{total}"

csvデータの中身は以下のようになっている。
市(または区)別に集計をしていく。

"連番","法人名","法人電話番号","法人郵便番号","法人住所"
"1","安威小学校","072-xxx-xxxx","567-xxxx","大阪府茨木市安威x-xx-xx"
"5","茨木市立小学校東小学校","072-xxx-xxxx","567-xxxx","大阪府茨木市鮎川x-x-xx"
"9","茨木市立小学校清溪小学校","072-xxx-xxxx","568-xxxx","大阪府茨木市泉原xxx"
"16","茨木市立小学校茨木小学校","072-xxx-xxxx","567-xxxx","大阪府茨木市片桐町x-xx"
...
...
...
"116","金蘭千里中学校","06-xxxx-xxxx","565-xxxx","大阪府吹田市藤白台x-xx-x"
"117","弘済中学校","06-xxxx-xxxx","565-xxxx","大阪府吹田市古江台x-x-x"
"118","吹田市立中学校豊津西中学校","06-xxxx-xxxx","564-xxxx","大阪府吹田市豊津町x-x"

必要に応じてcsvファイルの文字コード・改行コードを変更する。
実行結果。

$ cat school_data_osaka.csv | nkf -dw >hoge
$ ./count.rb hoge
大阪府吹田市, 57
大阪府茨木市, 47
大阪府大阪市, 456
合計 560
Rubyレシピブック 第2版 268の技
青木 峰郎 後藤 裕蔵 高橋 征義
ソフトバンク クリエイティブ
売り上げランキング: 63136
«
»