• ベストアンサー

任意な項目のソート

お世話になります。 なかなか説明自体が難しいのですが、 以下のようなファイルを読み、リストしたいのですが、 単純にリストするのではなく、ソートして並べ替えてからリストが必要です。 ファイル構成は、 名前<>所持金<>限度額<>最終異動日<> のような属性で、 (1)山田太郎<>120000<>200000<>080501<> (2)林佳子<>32500<>100000<>080429<> (3)浪速義郎<>257000<>300000<>080322<> (4)、、、、 のように入っています。 ((1)、(2)、(3)、、はレコードです。) リストは、 例えば、 あ:限度額の降順 い:最終異動日の昇順 等と指示されます。 例えば、 上記『あ』の例(限度額の降順)で教えていただけないでしょうか。 期待する結果は、 (3)浪速義郎<>257000<>300000<>080322<> (1)山田太郎<>120000<>200000<>080501<> (2)林佳子<>32500<>100000<>080429<> (4)、、、、 となれば良いのです。 ちなみに単純に読み込んだままでリストの時には以下のように書いています。 open(IN,"$file") || &error("Can't open $file"); @lines = <IN>; close(IN); foreach $line (@lines) {     local($trm01,$trm02,$trm03,$trm04) = split(/<>/,$line); 宜しくお願いします。

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

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

シュワルツ変換が定石かと: print map { $_->[0] } sort { $b->[1] <=> $a->[1] } map { [ $_, (split('<>'))[2] ] } <DATA>; __END__ (1)山田太郎<>120000<>200000<>080501<> (2)林佳子<>32500<>100000<>080429<> (3)浪速義郎<>257000<>300000<>080322<>

参考URL:
http://oshiete.goo.ne.jp/search/search.php?status=select&MT=%A5%B7%A5%E5%A5%EF%A5%EB%A5%C4%CA%D1%B4%B9
nagahaha
質問者

お礼

早速有り難うございました。 アットいう間に出来ました。 今後はこれを再利用させていただきます。 有り難うございました。

nagahaha
質問者

補足

お礼を述べた後で申し訳ありません。 1項目のソートは完璧に出来ましたが、 2項目も出来るのでしょうか。 限度額降順の最終異動日昇順、みたいに。 宜しくお願いします。

その他の回答 (1)

  • atom_seed
  • ベストアンサー率48% (25/52)
回答No.2

ハッシュ化して処理をするとやりやすくなりますよ # 一旦各行をハッシュ化して、配列に入れなおします my @data; foreach my $line (@lines) { my %hash; @hash{ '名前', '所持金', '限度額', '最終異動日' } = split( /<>/, $line ); push( @data, \%hash ); } # あ:限度額の降順の場合 @data = sort { $b->{'限度額'} <=> $a->{'限度額'} } @data; # い:最終異動日の昇順の場合 @data = sort { $a->{'最終異動日'} cmp $b->{'最終異動日'} } @data; # 並べ替えたものを出力 foreach my $data (@data) { my %hash = %{$data}; print join( "<>", @hash{ '名前', '所持金', '限度額', '最終異動日' } ), "\n"; }

nagahaha
質問者

お礼

早速有り難うございました。 回答をパッと見た途端、こちらの方が分かるかなと思いましたが、 勉強のため、1番の方をやってみたところ、アットいう間に完成してしまいました。 そのようなわけで誠に申し訳ありませんが、こちらは試しておりません。 (多分書かれていることを理解できるので大丈夫かと思います。) お世話になりました。

nagahaha
質問者

補足

atom_seedさん、 申し訳ありません、この欄をお借りします。 osamuyさんに宛てた『複数項目のソートはどうする』について、 同じ説明の中に出ていました。 よって、お手間を煩わせる必要がありませんでしたので、 追加質問をキャンセルしたかったのですが、 術が無く、ここをお借りしてしまいました。 そのようなわけで、 osamuyさん、出来ましたのでお手間を掛けぬようお願いします。 atom_seedさん、 申し訳ありませんでした。 皆様には大変お世話になり、有り難うございました。

関連するQ&A

専門家に質問してみよう