CGI-BBS > データベース > 簡易データベース > データのソート


カレッヂ
カレッヂ


質問者 Takashi  投稿日 9/10(月) 00:23:11
データベースのデータを項目(フィールド)ごとに複数キーでソート(分類)したいのですが
どのような方法を取ればいいのか概略を教えて下さい。
回答者 しあわせのツボ  [削除]  投稿日 9/10(月) 00:55:22
sort { (split(/\t/,$a))[1]<=>(split(/\t/,$b))[1]; } @array;
のような構文になります。

一連の質問を見て思うのですが、そこまで本格的なものを求めるのであれば、「簡易」データベースには荷が重すぎます。
いっそ、きちんとしたデータベースを利用されてはどうでしょうか。
質問者 Takashi  [削除]  投稿日 9/10(月) 10:17:08
ありがとうございます。
本格的なデータベースは全くわかりません。
他に別途色々なソフトが必要になるのでしょうか?

Perlにsort関数があることを知りませんでした。
Perlの参考書は持っていますが、文法書を持っていないため
構文を理解することが出来ません。
Perlの文法書でお勧めなどありましたら教えて頂けないでしょうか?
質問者 Takashi  [削除]  投稿日 9/13(木) 13:38:53
Perlの文法書を探したのですがありませんでしたので、
「Perl&CGI言語リファレンス」(インプレス)を買ったのですが
殆ど役に立ちませんでした。
Sortの文法もこの本だと良く分からずひとつお聞きしたいのですが、
複数キーのソートはどのようにすればいいのでしょうか?
教えていただけると幸いです。宜しくお願い致します。
質問者 Takashi  [削除]  投稿日 9/13(木) 13:47:50
ファイルに書かれたCSV形式のデータにレコード毎に3つキーを決め、
その3つのキーの優先順にレコード全体をsortしたいのです。
回答者 しあわせのツボ  [削除]  投稿日 9/13(木) 14:11:59
perlで複数キーによるソートができるかはわかりません。
(もちろんそれなりのロジックを組めば可能なはずですが、そこまでの技量は持ちあわせておりません)

もしご自分で何とかしようと思うなら。
sort関数の基本的な文法は
sort { $a <=> $b } @array;
で@arrayが昇順ソートされます。降順にするには$aと$bを逆にします。
次に@arrayの特定フィールドをもとにソートするには、$aと$bをsplitし、何番目の項目でソートするかを指定します。
データがタブ区切りで2番目のフィールドをキーにするなら、先に挙げた
sort { (split(/\t/,$a))[1]<=>(split(/\t/,$b))[1]; } @array;
になる訳です。

複数キーの処理ができたら、私にも方法を教えて下さい。
質問者 Takashi  [削除]  投稿日 9/13(木) 14:56:48
ありがとうございました。うまくいったら報告致します。
質問者 Takashi  [削除]  投稿日 9/14(金) 00:03:52
ここにヒントがあったのでやってみます。
http://ash.or.jp/ash/tips_prog/htm/sort_csv.htm
質問者 Takashi  [削除]  投稿日 9/14(金) 00:52:38
上記URLのサンプルスクリプトをそのままやってみましたが
DOS窓で試すとかなり時間がかかった上でout of memory になってしまい
うまくいきませんでした。データ量も多くありません。
もし何か分かりましたら教えて頂ける有り難いです。
質問者 Takashi  [削除]  投稿日 9/14(金) 01:33:33
結局こんなに簡単に出来てしまいましたが、それでは問題あるでしょうか?
(CSVデータを1レコードずつ@arrayに読み込み4つのキーで昇順ソートです)

@newarray = sort { (split(/\,/,$a))[0] <=> (split(/\,/,$b))[0] || (split(/\,/,$a))[1] <=> (split(/\,/,$b))[1] || (split(/\,/,$a))[2] <=> (split(/\,/,$b))[2] || (split(/\,/,$a))[3] <=> (split(/\,/,$b))[3]} @array;

返信(回答)する


Web裏技