カレッヂ |
質問者 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裏技 |