• ベストアンサー

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

Perlでの配列のソートについての質問です。 実行例) 数学,山田,60,佐藤,80,蓑田,55,岸本,90,小笠原,75 英語,山田,70,佐藤,50,蓑田,81,岸本,99,小笠原,80 上のようなcsvファイルを入力として、以下のように各行の中で点数順にソートしてから出力する 数学,岸本,90,佐藤,80,小笠原,75,山田,60,蓑田,55 英語,岸本,99,,蓑田,81,小笠原,80山田,70,佐藤,50 どのようにすればいいでしょうか?ご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.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

その他の回答 (5)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.5

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"); }

  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.4

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「もうちょっとなんとかならんものか」という, #1&#2 の指摘には同意. とはいえ, 世の中には「ものを知らない人間から渡される」こともあるから, 必ずしも質問者自身の責任とは言えない. さておき, 1. 行ごとに split して見出し (教科) とそれ以外のハッシュに分離 2. ハッシュをのキーを点数でソート 3. ソートした順に出力 かなぁ. うん, そんなに難しくもなさそう.

  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.2

私はこういうの、データじゃなくて文字の羅列と呼んでいます。 正規化したら、表計算ソフトで並び替えや各種計算が自由自在に・・・ まぁ期せずしてクソデータを処理せねばならぬ不幸の身になったのでしたら、 一旦splitで配列に放り込んだ後、二次元ハッシュで  $hash{教科}{名前} = 点数; のようにするしかないでしょう。

  • bardfish
  • ベストアンサー率28% (5029/17766)
回答No.1

まず、データの作り方自体から間違っています。 そういうデータ構造にすると後でものすごく苦労する。 1行の中にクラス全員の名前と点数を入れるなんてデータ構造的に不合格。最適化が全くなされていない、時間ばかりかかって益が少ない構造です。 もっとも一般的なデータ構造は ・教科ごとにテーブル(CSVファイル)を分ける ・1レコードには氏名(クラスと出席番号で識別できるようになっていると更に良い)と点数のみ というのが基本。 こういうデータ構造にしておけば一番単純なソート方法ですぐに解決する。Perlならソート自体は1行で済みます。 そのデータをなんとかして利用する方法を考えるより、データを作りなおしたほうが早いと思います。 そうすればPerlを使わなくてもExcelのソート操作で簡単に並べ替えられるしね。

関連するQ&A