# csvsort3.pl     
# 内容 :　対象ファイルをCSV形式としてソートする
# 　　　　文字列型の昇順・降順、数値型の昇順・降順の並べ替えを行う。
# 　　　　(通貨記号や","つきの数字は数値型としての並べ替えはできない)
# Copyright (c) 2009 Mitsuo Minagawa, All rights reserved.
# (minagawa@fb3.so-net.ne.jp)
# 使用方法 : c:\>perl csvsort3.pl
#
open(IN1,"input.txt");	
open(OUT1,">output_s.txt");	

# 整列の基準となる項目番号  
# ソートキー(2番目と1番目の項目)    
@sort_item	=	(1,0);
# ソートキーの入っている項目のデータ構造と昇順か降順かの指定
# 文字列型:C　数値型：N／昇順：A　降順：D　と指定する。
# 例：文字列型の降順：CD、数値型の昇順：NA、数値型の降順：ND
@sort_type	=	("NA","CA");

$in1_ctr	=	0;

# CSVファイルの入力
while	($line1	=	<IN1>)	{

	chomp($line1);
	$line1	=~	s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
	@in1	=	map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_}
				($line1 =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);

#	$in1[4]	=~	s/\\|\,//g;
	$in1_rec[$in1_ctr]	=	join("\t",@in1);
	$in1_ctr++;

}

# ソート項目の分だけ繰り返し
# 並べ替え処理(挿入ソート)

	@w_sort_type	=	reverse(@sort_type);
	@w_sort_item	=	reverse(@sort_item);

	for		($k	=	0;	$k	<=	$#w_sort_type;	$k++)	{

				$n			=	$w_sort_item[$k];

		if		($w_sort_type[$k]	eq	"CA")			{	#文字列型の昇順

			for		($i	=	0;	$i	<=	$#in1_rec;	$i++)	{
				for		($j	=	1;	$j	<=	($#in1_rec - $i);	$j++)	{

					$in1_key_a	=	(split("\t",$in1_rec[$j - 1]))[$n];
					$in1_key_b	=	(split("\t",$in1_rec[$j]))[$n];

					if	($in1_key_a		gt	$in1_key_b)		{	#逆順の時
						($in1_rec[$j],$in1_rec[$j - 1])	=	($in1_rec[$j - 1],$in1_rec[$j]);
					}
				}
			}
		}
		elsif	($w_sort_type[$k]	eq	"CD")			{	#文字列型の降順

			for		($i	=	0;	$i	<=	$#in1_rec;	$i++)	{
				for		($j	=	1;	$j	<=	($#in1_rec - $i);	$j++)	{

					$in1_key_a	=	(split("\t",$in1_rec[$j - 1]))[$n];
					$in1_key_b	=	(split("\t",$in1_rec[$j]))[$n];

					if	($in1_key_a		lt	$in1_key_b)	{	#逆順の時
						($in1_rec[$j],$in1_rec[$j - 1])	=	($in1_rec[$j - 1],$in1_rec[$j]);
					}
				}
			}
		}
		elsif	($w_sort_type[$k]	eq	"NA")			{	#数値型の昇順

			for		($i	=	0;	$i	<=	$#in1_rec;	$i++)	{
				for		($j	=	1;	$j	<=	($#in1_rec - $i);	$j++)	{

					$in1_key_a	=	(split("\t",$in1_rec[$j - 1]))[$n];
					$in1_key_b	=	(split("\t",$in1_rec[$j]))[$n];

					if	($in1_key_a		>	$in1_key_b)	{	#逆順の時
						($in1_rec[$j],$in1_rec[$j - 1])	=	($in1_rec[$j - 1],$in1_rec[$j]);
					}
				}
			}
		}
		elsif	($w_sort_type[$k]	eq	"ND")			{	#数値型の降順

			for		($i	=	0;	$i	<=	$#in1_rec;	$i++)	{
				for		($j	=	1;	$j	<=	($#in1_rec - $i);	$j++)	{

					$in1_key_a	=	(split("\t",$in1_rec[$j - 1]))[$n];
					$in1_key_b	=	(split("\t",$in1_rec[$j]))[$n];

					if	($in1_key_a		<	$in1_key_b)	{	#逆順の時
						($in1_rec[$j],$in1_rec[$j - 1])	=	($in1_rec[$j - 1],$in1_rec[$j]);
					}
				}
			}
		}
	}

# ソート済ファイルの出力
foreach	$record	(@in1_rec)	{
	print	OUT1	"$record\n";
}

close(IN1);
close(OUT1);
