Perl:CSV形式の配列変数を並び替える

 昨日CSVファイルをロードできるようになったCSVファイルのデータを、配列変数中で並び替える方法について調べてみました。


※プログラム初心者のため、このページのプログラムソースは正常に動作しない事がありますご注意下さい。
(あっちこっちのサイトの情報を寄せ集めてるので思わぬ不具合があるかも)

使い方
・前回と同様に配列変数「@csv_line」に対して操作するので、グローバル変数とするかローカル変数の宣言をして下さい。
・&csv_sort(モード,列番号);
モードは 0=数列昇順/9=数列降順/a=文字列昇順/z=文字列降順 で並び替えます。
列番号は 並び替える対象列の番号で、0以上の正数。

注意
・エラートラップはありません。

備忘録
・降順ではrevers関数(revers sort ・・・)は使わない方が良い。
例として
【1,ああ > 2,ああ > 3,いい】
と数字順で並んでいる値を、平仮名列でreversすると
【3,いい > 2,ああ > 1,ああ】
となり上手く動いているように見えるが、「ああ」の数字まで反転してしまっている。
revers関数を使わずに下記のプログラムで並び替えると
【3,いい > 1,ああ > 2,ああ】
となり、数字順に並んでいる物はそのままになる。
これが理解できずにバグかと思ってかなり悩んだ・・・

プログラム例

#-------------------------------------------------
# CSV形式の配列変数(@csv_line)をソートする
#-------------------------------------------------
sub csv_sort{	#0=mode 1=row
	if ($_[0] eq "0"){@csv_line = sort {(split(/,/,$a))[$_[1]] <=> (split(/,/,$b))[$_[1]]} @csv_line;}
	if ($_[0] eq "9"){@csv_line = sort {(split(/,/,$b))[$_[1]] <=> (split(/,/,$a))[$_[1]]} @csv_line;}
	if ($_[0] eq "a"){@csv_line = sort {(split(/,/,$a))[$_[1]] cmp (split(/,/,$b))[$_[1]]} @csv_line;}
	if ($_[0] eq "z"){@csv_line = sort {(split(/,/,$b))[$_[1]] cmp (split(/,/,$a))[$_[1]]} @csv_line;}
}
#-------------------------------------------------

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA