# csvsort_another.pl     
# 内容 :　対象ファイルをCSV形式として昇順ソートする      
# 2011 Minagawa Mitsuo (minagawa@fb3.so-net.ne.jp)       
# 使用方法 : c:\>perl csvsort_another.pl
#
open(IN1,"input.txt");
open(OUT1,">output.txt");

# ソートキーの入っている項目番号
@sortkey		=	(1,0);
# ソートキーをセットするハッシュのキー
$key	=	undef;
# ソート用のキーと1行分レコードをセットするハッシュ
%sort_record	=	();
# 入力件数を初期設定する。
$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",$in1_ctr);
# レコードをハッシュの値としてセットする。
	$sort_record{$key}	=	$line1;
	$in1_ctr++;
	$key	=	undef;
}
# ハッシュのキーをソートし、キー順にレコードを出力する
foreach	$recno	(sort	keys	%sort_record)	{
		print OUT1 "$sort_record{$recno}\n";
}
close(IN1);
close(OUT1);

