# merge_hash.pl
# 内容 : マージプログラム（２ファイルの１対１マッチングをした後、１ファイルに統合する）
# 前提 : マスタファイルとトランザクションファイルの両方とも
#        マッチングするキーごとに昇順に並べ替えておく必要はない
# Copyright (c) 2012 Mitsuo Minagawa, All rights reserved.
# (minagawa@fb3.so-net.ne.jp)
# 使用方法 : c:\>perl merge_hash.pl
#
# マスタデータをを入れるハッシュ
my %data1;
# トランザクションデータを入れるハッシュ
my %data2;
# マージしたデータを入れるハッシュ
my %out1;

# マスタデータをハッシュに入れる
open(IN1,"master.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];
# 配列のリファレンスを生成し、ハッシュに配列を代入する
	$data1{$in1_key} = [@in1];
}
close(IN1);

# トランザクションデータをハッシュに入れる
open(IN2,"transaction.txt");
while($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];
# 配列のリファレンスを生成し、ハッシュに配列を代入する
	$data2{$in2_key} = [@in2];
}
close(IN2);

#マスタのデータを優先させる場合
#foreach my $key (sort keys %data1) {
#		$out1{$key}	=	$data1{$key};
#}

#foreach my $key (sort keys %data2) {
# ハッシュのキーが存在しない場合(トランザクションにしかないとき)
#	unless	(exists $data1{$key})	{
#		$out1{$key}	=	$data2{$key};
#	}
#}

#トランザクションのデータを優先させる場合
foreach my $key (sort keys %data2) {
		$out1{$key}	=	$data2{$key};
}

foreach my $key (sort keys %data1) {
#ハッシュのキーが存在しない場合(マスタにしかないとき)
	unless	(exists $data2{$key})	{
		$out1{$key}	=	$data1{$key};
	}
}

open(OUT1,">merge.txt");
# ハッシュのキーをソートしながら
foreach my $key (sort keys %out1) {
# 配列のリファレンスを配列に戻して出力する
	print OUT1 join("\t", @{$out1{$key}})."\n";
}
close(OUT1);

