# double2_hash.pl
# 内容 :　重複チェック後、重複データには、「重複」表示をする。
# 前提 :　重複チェックしたいキーであらかじめソートしておく必要はない。
# Copyright (c) 2013 Mitsuo Minagawa, All rights reserved.
# (minagawa@fb3.so-net.ne.jp)
# 使用方法 : c:\>perl double2_hash.pl
# 
# 出力用ハッシュ
my %out1;

# マスタデータをハッシュに入れる
open(IN1,"double.txt");
while($line1	=	<IN1>) {
	chomp($line1);
#---区切り文字により、処理を変更する----------
#タブ区切りのとき
#	@in1	=	split("\t",$line1);

#カンマ区切りのとき
	my $tmp	=	$line1;
	$tmp	=~	s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
	@in1	=	map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_}
					($tmp =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
#-----------------
	$in1_key	=	$in1[0];
# ハッシュのキーがすでに存在する場合
	if		(exists $out1{$in1_key})	{
			@double		=	@{$out1{$in1_key}};
			$double[0]	+=	1;		#配列の0番目に件数を加算
			push(@double,$line1);	#配列の2番目以降にデータ追加
			$out1{$in1_key}	=	[@double];
	}
# ハッシュのキーが存在しない場合
	else								{
			@double		=	();
			$double[0]	=	1;		#配列の0番目に件数をセット
			push(@double,$line1);	#配列の1番目にデータをセット
			$out1{$in1_key}	=	[@double];
	}
}
close(IN1);


open(OUT1,">double_check.txt");
# ハッシュのキーをソートして出力する
foreach my $key (sort keys %out1) {
# 件数が1件のとき(重複データでないとき)
	if		(${$out1{$key}}[0]	==	1)		{
			shift(@{$out1{$key}});	#件数の入った配列の0番目を削除
			print OUT1 join("\n", @{$out1{$key}})."\n";
	}
# 件数が2件以上のとき(重複データのとき)
	else									{
			shift(@{$out1{$key}});	#件数の入った配列の0番目を削除
			foreach	$data	(@{$out1{$key}})		{
					$temp	=	join(",",$data,"重複");
					print OUT1 $temp."\n";
			}
	}
}
close(OUT1);
