師匠の散歩

きままにPerlでも

SORT-2次元配列

2次元配列を並び替える/ checkSort2.cgi

目的

1次元配列では、sort関数で簡単に並び替えが可能だった。しかし、2次元配列については簡単ではないようで、いろいろ調べて次の形式となったのでここに記載する。

元データ

my @data;
$data[0][0]=34.12345;
$data[0][1]="aa";
$data[0][2]="富士山";

$data[1][0]=34.012;
$data[1][1]="ab";
$data[1][2]="赤城山";
 
$data[2][0]=135.1;
$data[2][1]="a";
$data[2][2]="羅臼岳";

評価結果

数字順の場合は次のようにする

@data = sort { @$a[0] <=> @$b[0] } @data;
34.012 / 3 / 赤城山
34.12345 / 1 / 富士山
135.1 / 2 / 羅臼岳

データ2を昇順

@data = sort { @$a[1] <=> @$b[1] } @data;
34.12345 / 1 / 富士山
135.1 / 2 / 羅臼岳
34.012 / 3 / 赤城山

データ2を降順

@data = sort { @$b[1] <=> @$a[1] } @data;
34.012 / 3 / 赤城山
135.1 / 2 / 羅臼岳
34.12345 / 1 / 富士山

アルファベットの場合 <=>ではなくcmpを使う

@data = sort { @$a[1] cmp @$b[1] } @data;
34.12345 / 1 / 富士山
135.1 / 2 / 羅臼岳
34.012 / 3 / 赤城山

漢字(2バイト文字)もcmpを使う

@data = sort { @$a[2] <=> @$b[2] } @data;
34.12345 / 1 / 富士山
135.1 / 2 / 羅臼岳
34.012 / 3 / 赤城山
@data = sort { @$a[2] cmp @$b[2] } @data;
34.012 / 3 / 赤城山
34.12345 / 1 / 富士山
135.1 / 2 / 羅臼岳

ソース

元データがカンマ区切りのCSVファイルであればこのようにすれば格納できる。

# CSVファイルを @source に入れる(スクリプト省略)
# @file の配列数を調べても良いが、ここでは0〜9とした
my (@file,@data);
foreach(@source){
  @file = split/\,/;
  # 2次元配列 @data に格納する
  for (my $i=0;$i<10;$i++) {
    $data[$count][$i] = $file[$i];
  }
}

あとがき

CSVファイル(2次元配列)の並び替えができれば、まずは実用上目的を達成できたと考える。しかし、3次元以上の多次元配列では今後の宿題事項となる。宿題を済ませる予定は一切ないが。。。


checkSort2.cgi // Topに戻る // indexに戻る
Copyright(C) 2009-2021 Grandmaster Last up : 2020/09/18