# double2.pl
# 内容 :　重複チェック後、重複データには、「*」をつける。
# 前提 :　重複チェックしたいキーであらかじめソートしておく。
# Copyright (c) 2002-2011 Mitsuo Minagawa, All rights reserved.
# (minagawa@fb3.so-net.ne.jp)
# 使用方法 : c:\>perl double2.pl
#
# 初期値設定
$low_value	=	pack("h8","00000000");	#low-value	
$in1_key	=	$low_value;		#入力キー
$sv_key		=	$low_value;		#保存した入力キー
@in1		=	();				#1件分の入力データ

open(IN11,"double.txt");	
open(OUT11,">single_temp.txt");		#重複データを除いたレコード
while	($line1	=	<IN11>)	{	
	chomp($line1);	
	my $tmp	=	$line1;
	$tmp	=~	s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
	@in1	=	map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_}
				($tmp =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
	$in1_key	=	$in1[0];	
	if		($in1_key		ne	$sv_key)	{	
			$out1	=	join(",",@in1);	
			print	OUT11	"$out1\n";	
	}	
	$sv_key		=	$in1_key;
}	
close(IN11);	
close(OUT11);	
#---------------------------------------------------
open(IN21,"double.txt");	
open(OUT21,">double_temp.txt");			#重複のみのレコード	

# 初期値設定
$low_value	=	pack("h8","00000000");	#low-value	
$in1_key	=	$low_value;		#入力キー
$sv_key		=	$low_value;		#1件前の保存キー
$sv_key2	=	$low_value;		#2件前の保存キー
@in1		=	();				#1件分の入力データ
$in1_ctr	=	0;				#入力件数
@save1		=	();				#保存データ

while	($line1	=	<IN21>)				{	
	chomp($line1);	
	$in1_ctr++;	
	my $tmp	=	$line1;
	$tmp	=~	s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
	@in1	=	map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_}
				($tmp =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
	$in1_key	=	$in1[0];	
	if		($sv_key	eq	$in1_key)		{	
			$out1	=	join(",",@save1,"重複");
			print	OUT21	"$out1\n";	
			$sv_key2	=	$sv_key;	
	}	
	elsif	(($sv_key2	eq	$sv_key)	
		&&	($sv_key	ne	$low_value))	{	
			$out1	=	join(",",@save1,"重複");
			print	OUT21	"$out1\n";	
	}	
	$sv_key		=	$in1_key;	
	@save1		=	@in1;	
}	
if		(($in1_ctr	>	0)	
	&&	($sv_key2	eq	$sv_key))	{	
		$out1	=	join(",",@save1,"重複");
		print	OUT21	"$out1\n";	
}	
close(IN21);	
close(OUT21);	
#------------------------------------------------   
open(IN31,"double_temp.txt");			#重複のみのレコード	
open(IN32,"single_temp.txt");			#重複データを除いたレコード
open(OUT31,">double_check.txt");		#マージしたファイル	

# 初期値設定
$high_value	=	pack("h8","ffffffff");	#終了判定
$low_value	=	pack("h8","00000000");	#low-value
@in1		=	();				#マスタデータ
$in1_key	=	$low_value;		#マスタキー
@in2		=	();				#トランザクションデータ
$in2_key	=	$low_value;		#トランザクションキー

s_in1();	
s_in2();	

#
# 入力データが終了するまで繰り返す。  
#
until	(($in1_key	eq	$high_value)	
	&&	($in2_key	eq	$high_value))	{	
#
# 主処理
#
	if		($in1_key	eq	$in2_key)	{	
		until	($in1_key	ne	$in2_key)	{	
			s_match();	
			s_in2();	
		}	
			s_in1();	
	}	
	elsif	($in1_key	lt	$in2_key)	{	
			s_master_only();	
			s_in1();	
	}	
	elsif	($in1_key	gt	$in2_key)	{	
			s_trans_only();	
			s_in2();	
	}	
}	
#
# マスタファイル入力  
#
sub	s_in1	{	
	if		($line1		=	<IN31>)	{	
			chomp($line1);	
			my	$tmp	=	$line1;	
			$tmp	=~	s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;	
			@in1	=	map{/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_}
						($tmp	=~	/("[^"]*(?:""[^"]*)*"|[^,]*),/g);	
			$in1_key	=	$in1[0];	
	}	
	else	{								#マスタファイルが終了のとき	
			$in1_key	=	$high_value;
	}	
}	
#
# トランザクションファイル入力    
#
sub	s_in2	{	
	if		($line2		=	<IN32>)	{	
			chomp($line2);	
			my	$tmp	=	$line2;	
			$tmp	=~	s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;	
			@in2	=	map{/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_} 
						($tmp	=~	/("[^"]*(?:""[^"]*)*"|[^,]*),/g);	
			$in2_key	=	$in2[0];	
	}	
	else	{						#トランザクションファイルが終了のとき
			$in2_key	=	$high_value;
	}	
}	
#
# マッチングしたときの処理    
#
sub	s_match		{	
		$out1	=	join(",",@in1);	
		print	OUT31	"$out1\n";	
}	
#
# マスターオンリーの処理  
#
sub	s_master_only	{	
		$out2	=	join(",",@in1);	
		print	OUT31	"$out2\n";	
}	
#
# トランザクションオンリーの処理  
#
sub	s_trans_only	{	
		$out3	=	join(",",@in2);	
		print	OUT31	"$out3\n";	
}	
close(IN31);	
close(IN32);	
close(OUT31);	

