# csvsort.pl
# 内容 : CSV形式データのソート（対象ファイルをCSV形式としてソートする）
# Copyright (c) 2002-2011 Mitsuo Minagawa, All rights reserved.
# (minagawa@fb3.so-net.ne.jp)
# 使用方法 : c:\>perl csvsort.pl
#   
open(IN1,"input.txt");	
open(OUT1,">output.txt");	

# ソートキーの入っている項目番号
@sortkey	=	(1,0);
# ソートキーをセットするハッシュのキー
$key	=	undef;
# ソート用のキーと1行分レコードをセットするハッシュ
%sort_record	=	();
# 入力ファイルを全部読み込む。
@record	=	<IN1>;	
# ソートキーとなる項目番号からソートキーとなる文字列を作っておく。
#recno番目のレコードがrecordである。
foreach	$recno	(0..$#record)	{
	chomp($record[$recno]);
# 入力ファイルをカンマで分解する。
	$tmp	=	$record[$recno];
	$tmp	=~	s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
	@in1	=	map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_}
				($tmp =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
# 入力ファイルをタブで分解する。
#	@in1	=	split("\t",$record[$recno],-1);
# ソートキーとなる項目の内容をタブで連結してハッシュのキーとする。
	foreach	$sortno	(@sortkey)	{	
		$key	.=	$in1[$sortno] . "\t";
	}	
# 同じ値を持つキーが複数存在する場合に以下のように指定する。
	$key	.=	sprintf("%08d",$recno);
# レコードをハッシュの値としてセットする。
	$sort_record{$key}	=	$record[$recno];
	$key	=	undef;
}
# ハッシュのキーをソートし、キー順にレコードを出力する。
foreach	$recno	(sort	keys	%sort_record)	{
		print	OUT1	"$sort_record{$recno}\n";
}
close(IN1);
close(OUT1);
