CGI-BBS > データベース > 簡易データベース > CSVエディタの改造で表示をアイウエオ順にしたい。


カレッヂ
カレッヂ


質問者 オリエ  投稿日 9/15(日) 01:07:32
CSVエディタのデータを呼び出すとき、古い順や新しい順の他に、
あいうえお順を選択できるようにしたいのです。
辞書CGIなどのCSVデータを管理するには、重宝すると思います。
よろしくお願いいたします。
(申し訳ないですが、当方CGIはあまりわかりません。
「理解できなくてもいいからとりあえずこうしてみろ」
というご指示を頂ければ、と思います。)

プロバイダ参照:
サーバのOS:(未選択)
パソコンのOS:Mac9
エディタ:Jedit
FTPソフト:Fetch
サーバ移転:していない
改造:していない
CGI習熟度:middle

回答者 やまだ  [削除]  投稿日 9/15(日) 07:05:28
ASCIIコード順にソートでしたら、簡単に1,2行で改良できます。
(たぶん、以前にもこんな質問があったような。。。)
line136あたりの

foreach $data (@NEW){

直前くらいで、ソートするとよいでしょう。
具体的に、コードは、

@NEW=sort{($m{$a}||=(split(/\,/,$a))[2]) cmp ($m{$b}||=(split(/\,/,$b))[2])}@NEW;
か、
@NEW=map{$_->[0]}sort{$a->[1] cmp $b->[1]}map{[$_,(split(/\,/,$_))[2]]}@NEW;

で、よいかと思います。大量のレコード(行)がある場合は、次のでよいかと。

@tmp=map{(split(/\,/,$_))[2]}@NEW;
@NEW=@NEW[sort{$tmp[$a] cmp $tmp[$b]}0..$#tmp];

ソートを選択させるのは、フォームから"どのソートにするか"っていうものとして
ひっぱってきた文字または数字などで、うまくできるでしょう。
質問者 オリエ  [削除]  投稿日 9/16(月) 00:36:12
もうしわけありません。

foreach $data (@NEW){

が見つからないのですが……。

http://www.rescue.ne.jp/cgi/csveditor/csvedit.txt

ここからダウンロードしたCGIについての質問だったのですが、
この中にありますでしょうか?
回答者 やまだ  [削除]  投稿日 9/16(月) 01:25:35
失礼しました。簡易DBだと思ってました。

でも、本質的に同じようなので、改良個所は、場所と少々の修正でOKなはずです。

場所は、158行目あたりの
foreach $num ($start..$to){
の直前あたり(これは、CGIの分かる方なら別にこことは限定しない。)
で、さきほどの(昨日の)コードを修正して挿入してみてください。

修正するのは、@NEW配列を@BASE配列に換えるだけです。
これで、NAMEをASCIIコード順にソートされるはずです。
質問者 オリエ  [削除]  投稿日 9/16(月) 12:43:22
並び変わりました!
動作するようになったのを確認できました。

……が。すみません!
ソートしたい項目が何番目であるかをきちんとお伝えしておりませんでした。

「NAME」の項目ではなく、一番最初の、デフォルトでは空欄になっている項目を、
ソートの対照としたかったのです。

ご指示いただきましたプログラムで、どこを修正すればよろしいでしょうか。
何度も申し訳ありませんが、再度ご教授いただけますようお願いします。

(何をどうしたいのかを明記するのは基本ですよね……以後気をつけます;;)

回答者 やまだ  [削除]  投稿日 9/16(月) 23:37:34
NAMEでない属性でソートしたいのなら、最初のcammaでsplitして配列からとり出す値
を2番目から違った値にすりゃいいですよ。
こんかい一番最初の未定義っていうものなんで、0番目とするとよいでしょう。
(比較対象が、文字列でない場合、'cmp' を '<=>'としましょう。)
つまり、

@BASE=sort{($m{$a}||=(split(/\,/,$a))[0]) cmp ($m{$b}||=(split(/\,/,$b))[0])}@BASE;
か、
@BASE=map{$_->[0]}sort{$a->[1] cmp $b->[1]}map{[$_,(split(/\,/,$_))[0]]}@BASE;
か、
@tmp=map{(split(/\,/,$_))[0]}@BASE;
@BASE=@BASE[sort{$tmp[$a] cmp $tmp[$b]}0..$#tmp];

でしょうか。
回答者 やまだ  [削除]  投稿日 9/17(火) 02:13:27
挿入位置をミスりました。

73行目あたりの 
close(IN);
の直後で。

返信(回答)する


Web裏技