# merge.pl
# 内容 : マージプログラム（２ファイルの１対１マッチングをした後、１ファイルに統合する）
# 前提 : マスタファイルとトランザクションファイルの両方を
#        マージするキーごとに昇順に並べ替えておくこと 
# Copyright (c) 2002-2011 Mitsuo Minagawa, All rights reserved.
# (minagawa@fb3.so-net.ne.jp)
# 使用方法 : c:\>perl merge.pl
#

# ファイルのオープン
open(IN1,"master.txt");			#マスタファイル
open(IN2,"transaction.txt");	#トランザクションファイル
open(OUT1,">merge.txt");		#マージしたファイル

# 初期値設定
$high_value	=	pack("h8","ffffffff");	#終了判定
$low_value	=	pack("h8","00000000");	#low-value
$in1_key	=	$low_value;		#マスタキー
$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)	{
			s_match();
			s_in1();
			s_in2();
	}

# マスタオンリーの時（マスタファイルだけにデータがある）
	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		=	<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];
	}
	else	{					#マスタファイルが終了のとき
			$in1_key	=	$high_value; 
	}
}

# トランザクションファイル入力
sub	s_in2	{
	if		($line2		=	<IN2>)	{
			chomp($line2);
#---区切り文字により、処理を変更する----------
#タブ区切りのとき
#			@in2	=	split("\t",$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("\t",@in1);
		print	OUT1	"$out1\n";
}

# マスタオンリー時の処理
sub	s_master_only	{
		$out2	=	join("\t",@in1);
		print	OUT1	"$out2\n";
}

# トランザクションオンリー時の処理
sub	s_trans_only	{
		$out3	=	join("\t",@in2);
		print	OUT1	"$out3\n";
}

# ファイルのクローズ
close(IN1);
close(IN2);
close(OUT1);
