アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。
なかなか説明自体が難しいのですが、
以下のようなファイルを読み、リストしたいのですが、
単純にリストするのではなく、ソートして並べ替えてからリストが必要です。

ファイル構成は、
名前<>所持金<>限度額<>最終異動日<>
のような属性で、
(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);

宜しくお願いします。

A 回答 (2件)

シュワルツ変換が定石かと:



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?statu …

この回答への補足

お礼を述べた後で申し訳ありません。
1項目のソートは完璧に出来ましたが、
2項目も出来るのでしょうか。

限度額降順の最終異動日昇順、みたいに。
宜しくお願いします。

補足日時:2008/05/14 11:06
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/05/14 11:06

ハッシュ化して処理をするとやりやすくなりますよ




# 一旦各行をハッシュ化して、配列に入れなおします
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";
}

この回答への補足

atom_seedさん、
申し訳ありません、この欄をお借りします。

osamuyさんに宛てた『複数項目のソートはどうする』について、
同じ説明の中に出ていました。
よって、お手間を煩わせる必要がありませんでしたので、
追加質問をキャンセルしたかったのですが、
術が無く、ここをお借りしてしまいました。

そのようなわけで、
osamuyさん、出来ましたのでお手間を掛けぬようお願いします。

atom_seedさん、
申し訳ありませんでした。

皆様には大変お世話になり、有り難うございました。

補足日時:2008/05/14 11:54
    • good
    • 0
この回答へのお礼

早速有り難うございました。
回答をパッと見た途端、こちらの方が分かるかなと思いましたが、
勉強のため、1番の方をやってみたところ、アットいう間に完成してしまいました。

そのようなわけで誠に申し訳ありませんが、こちらは試しておりません。
(多分書かれていることを理解できるので大丈夫かと思います。)
お世話になりました。

お礼日時:2008/05/14 11:18

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