電子書籍の厳選無料作品が豊富!

Perlでの配列のソートについての質問です。

実行例)
数学,山田,60,佐藤,80,蓑田,55,岸本,90,小笠原,75
英語,山田,70,佐藤,50,蓑田,81,岸本,99,小笠原,80

上のようなcsvファイルを入力として、以下のように各行の中で点数順にソートしてから出力する

数学,岸本,90,佐藤,80,小笠原,75,山田,60,蓑田,55
英語,岸本,99,,蓑田,81,小笠原,80山田,70,佐藤,50

どのようにすればいいでしょうか?ご教授願います。

A 回答 (6件)

#No.2です。


さして考えもせず「コレ系は二次元ハッシュ」と答えてしまいましたが、
実際に考えるとただのハッシュでした。
失礼しました。

while( <DATA> ) {
chomp;
my ($subject, %results) = split /,/;
my $result;

foreach ( sort { $results{$b} <=> $results{$a} } keys %results ) {
$result .= "$_,$results{$_},";
}

$result = substr($result, 0, -1);
print "$subject," . "$result\n";

}

__DATA__
数学,山田,60,佐藤,80,蓑田,55,岸本,90,小笠原,75
英語,山田,70,佐藤,50,蓑田,81,岸本,99,小笠原,80
    • good
    • 0

while(<>){


chomp;
@s = split(",");
print($s[0],",");
for( $i=0; $i<(@s/2-1); $i++){
$w[$i][0] = $s[$i*2+1];
$w[$i][1] = $s[$i*2+2];
}
@sorted = sort { $a->[1] <=> $b->[1] } @w;
@list = ();
for($i=0;$i<(@s/2-1);$i++){
push @list, $sorted[$i][0], $sorted[$i][1];
}
print join(",",@list);
printf("\n");
}
    • good
    • 0

No.3さんの方針でコーディング。



while( <DATA> ) {
chomp;
my ($subject, %score) = split /,/;

my $sorted = join q{,},
map +( $_, $score{$_} ),
sort { $score{$b} <=> $score{$a} }
keys %score;

print "$subject,$sorted\n";
}

__DATA__
数学,山田,60,佐藤,80,蓑田,55,岸本,90,小笠原,75
英語,山田,70,佐藤,50,蓑田,81,岸本,99,小笠原,80
    • good
    • 0

「もうちょっとなんとかならんものか」という, #1&#2 の指摘には同意. とはいえ, 世の中には「ものを知らない人間から渡される」こともあるから, 必ずしも質問者自身の責任とは言えない.



さておき,
1. 行ごとに split して見出し (教科) とそれ以外のハッシュに分離
2. ハッシュをのキーを点数でソート
3. ソートした順に出力
かなぁ. うん, そんなに難しくもなさそう.
    • good
    • 0

私はこういうの、データじゃなくて文字の羅列と呼んでいます。


正規化したら、表計算ソフトで並び替えや各種計算が自由自在に・・・

まぁ期せずしてクソデータを処理せねばならぬ不幸の身になったのでしたら、
一旦splitで配列に放り込んだ後、二次元ハッシュで
 $hash{教科}{名前} = 点数;
のようにするしかないでしょう。
    • good
    • 0

まず、データの作り方自体から間違っています。



そういうデータ構造にすると後でものすごく苦労する。


1行の中にクラス全員の名前と点数を入れるなんてデータ構造的に不合格。最適化が全くなされていない、時間ばかりかかって益が少ない構造です。

もっとも一般的なデータ構造は
・教科ごとにテーブル(CSVファイル)を分ける
・1レコードには氏名(クラスと出席番号で識別できるようになっていると更に良い)と点数のみ
というのが基本。

こういうデータ構造にしておけば一番単純なソート方法ですぐに解決する。Perlならソート自体は1行で済みます。


そのデータをなんとかして利用する方法を考えるより、データを作りなおしたほうが早いと思います。
そうすればPerlを使わなくてもExcelのソート操作で簡単に並べ替えられるしね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!