# keycount.pl
# 内容 :CSV形式のファイルのソートキーごとの件数と累計件数をカウントする。
# Copyright (c) 2011 Mitsuo Minagawa, All rights reserved.
# (minagawa@fb3.so-net.ne.jp)
# 使用方法 : c:\>perl keycount.pl
#
open(IN1,"input.txt");
open(OUT1,">output.txt");

# ソートキーの入っている項目番号
@sortkey		=	(1,0);
# ソート用のキー
$key			=	undef;
# ソート用のキーと件数をセットするハッシュ
%sort_record	=	();
# 累計件数
$total_ctr	=	0;
# ソートキーとなる項目番号からソートキーとなる文字列を作っておく
while	($line1	=	<IN1>)	{
	# 対象ファイルをカンマで分解する
	chomp($line1);
	$tmp	=	$line1;	
	$tmp	=~	s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
	@in1	=	map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_}
               ($tmp =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
#	@in1	=	split("\t",$line1,-1);
	# ソートキーとなる項目内容をタブをはさんで連結してキーとする
	foreach $sortno	(@sortkey)	{
		$key	.=	$in1[$sortno] . "\t";
	}
	chop($key);
	# ソートキーに該当するキーがあれば、件数を加算する。
	if		($sort_record{$key})			{
			$sort_record{$key}	+=	1;
	}
	# 新たなソートキーに該当する場合は、初期値1をセットする。
	else									{
			$sort_record{$key}	=	1;
	}
	$key	=	undef;
}
# ハッシュのキーをソートし、キー順にレコードを出力する
foreach	$recno	(sort	keys	%sort_record)	{
		$total_ctr	+=	$sort_record{$recno};
		$out1	=	join("\t",$recno,$sort_record{$recno},$total_ctr);
		print OUT1 "$out1\n";
}
close(IN1);
close(OUT1);
