# csvsort_many.pl
# 内容 :大量のCSVファイルを文字列型で昇順にソートする
# Copyright (c) 2011 Mitsuo Minagawa, All rights reserved.
# (minagawa@fb3.so-net.ne.jp)
# 使用方法 : c:\>perl csvsort_many.pl
#
open(IN1,"input.txt");
open(OUT1,">output.txt");

# ソートキーの入っている項目番号
@sortkey		=	(0,1);
# ソート用のキー
$key			=	undef;
# ソートするキーとレコードをセットするハッシュ
%sort_record01	=	();
%sort_record02	=	();
%sort_record03	=	();
%sort_record04	=	();
%sort_record05	=	();
%sort_record06	=	();
%sort_record07	=	();
%sort_record08	=	();
%sort_record09	=	();
%sort_record10	=	();
%sort_record11	=	();
%sort_record12	=	();

# 入力件数
$in1_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";
	}
	#レコードキーが同一でレコードが集約されてしまう場合にセット
	$key	.=	sprintf("%08d",$recno);
	# ソートキーとソートキーに対応するレコード(CSVファイルの各行)をハッシュにセットする
	if		($in1[0]	le		"AAJJ")				{
			$sort_record01{$key}	=	$line1;
	}
	elsif	($in1[0]	le		"AAVV")				{
			$sort_record02{$key}	=	$line1;
	}
	elsif	($in1[0]	le		"BBJJ")				{
			$sort_record03{$key}	=	$line1;
	}
	elsif	($in1[0]	le		"BBVV")				{
			$sort_record04{$key}	=	$line1;
	}
	elsif	($in1[0]	le		"CCJJ")				{
			$sort_record05{$key}	=	$line1;
	}
	elsif	($in1[0]	le		"CCVV")				{
			$sort_record06{$key}	=	$line1;
	}
	elsif	($in1[0]	le		"XXJJ")				{
			$sort_record07{$key}	=	$line1;
	}
	elsif	($in1[0]	le		"XXVV")				{
			$sort_record08{$key}	=	$line1;
	}
	elsif	($in1[0]	le		"YYJJ")				{
			$sort_record09{$key}	=	$line1;
	}
	elsif	($in1[0]	le		"YYVV")				{
			$sort_record10{$key}	=	$line1;
	}
	elsif	($in1[0]	le		"ZZJJ")				{
			$sort_record11{$key}	=	$line1;
	}
	elsif	($in1[0]	le		"ZZVV")				{
			$sort_record12{$key}	=	$line1;
	}
	$in1_ctr++;
	$key	=	undef;
}
# ハッシュのキーをソートし、キー順にレコードを出力する
foreach	$recno	(sort	keys	%sort_record01)	{
		print OUT1 "$sort_record01{$recno}\n";
}
foreach	$recno	(sort	keys	%sort_record02)	{
		print OUT1 "$sort_record02{$recno}\n";
}
foreach	$recno	(sort	keys	%sort_record03)	{
		print OUT1 "$sort_record03{$recno}\n";
}
foreach	$recno	(sort	keys	%sort_record04)	{
		print OUT1 "$sort_record04{$recno}\n";
}
foreach	$recno	(sort	keys	%sort_record05)	{
		print OUT1 "$sort_record05{$recno}\n";
}
foreach	$recno	(sort	keys	%sort_record06)	{
		print OUT1 "$sort_record06{$recno}\n";
}
foreach	$recno	(sort	keys	%sort_record07)	{
		print OUT1 "$sort_record07{$recno}\n";
}
foreach	$recno	(sort	keys	%sort_record08)	{
		print OUT1 "$sort_record08{$recno}\n";
}
foreach	$recno	(sort	keys	%sort_record09)	{
		print OUT1 "$sort_record09{$recno}\n";
}
foreach	$recno	(sort	keys	%sort_record10)	{
		print OUT1 "$sort_record10{$recno}\n";
}
foreach	$recno	(sort	keys	%sort_record11)	{
		print OUT1 "$sort_record11{$recno}\n";
}
foreach	$recno	(sort	keys	%sort_record12)	{
		print OUT1 "$sort_record12{$recno}\n";
}

close(IN1);
close(OUT1);

