着せ替えのデータはJavaScriptの配列で出来てるんだけど、並べ替えとかするときに配列番号を全部変えないといけないから結構大変。
普通に最後に追加するだけなら、コピペして配列番号とデータを書き換えればいいだけなんだけど、もうちょっと楽できないかなぁ・・・っとw
で、考えたのがCSV化してしまう方法。
CSVなら表計算ソフトで読み込めるから、並び替えも移動も楽だしね。
Webで使用するデータベースだから、SQLを使ったほうが何かと便利なんだけど、サーバによってはデータベース使えない場合もあるから、SQLはできるだけ使いたくないのよね。
それにCSVならテキストデータだから、最悪テキストエディタさえあれば編集できるし♪
CSVと言えば衣装データ一覧表でも使ってるけど、JavaScriptで直接CSVは利用できないから、色々前処理したりIFRAME使ったりと小技を駆使してるわけなんだけど、これも面倒。
そこで、CSVをJavaScriptの配列として変換するCGIを作ってみました。
条件
・”,”(カンマ)区切りであること。TSVは不可。
・文字列は”(ダブルクォート)で括られていること。
■csv2jsa.cgi
#!/usr/bin/perl
use File::Basename qw(basename); $my_filename = basename($0, '');
# CSVデータのJavaScript出力(カンマ区切り) # csv2jsa.cgi #----------------------------------------------------
#初期設定ファイル require './csv2jsa.ini';
#----------------------------------------------------
$formin = $ENV{'QUERY_STRING'}; @opt = split (/&/,$formin); foreach $tmp (@opt) { ($name,$value) = split (/=/,$tmp); if($value ne "" || $value != null){ if($name eq "data"){$fcsv = $value}; if($name eq "name"){$aname = $value}; if($name eq "mode" && $value <= $#ctype){$vmode = $value}; } }
@csv = &readCsv($fcsv); &outCsv($fcsv, $vmode, @csv); exit;
sub outCsv { my $fcsv = shift; my $vmode = shift; my @csv = @_; my $ntime = &nowTime(); print "Content-type: $ctype[$vmode]\n\n"; print "//*****************************************\n"; print "// DATA : $fcsv\n"; print "// DATE : $ntime\n"; print "//*****************************************\n"; print "// Generated by $my_filename\n\n";
print "var $aname = new Array()\;\n";
my $n = @csv; for($i = 0; $i < $n; $i++){ my $line = $csv[$i]; chomp ($line); $line =~ s/[\r\n]*$//; if($line !~ /^\s*$/) {print "$aname\[$i\] = \[$line\]\;\n"}; } print "\n"; }
sub readCsv { my $fin = shift; my @data = (); if(open(FI,"$fin")){ @data = <FI>; close(FI); }else{ @data = ("\"\\[ERROR\\]$my_filename:$emsg[1]\"\n"); } chomp(@data); return @data; }
sub nowTime { my @youbi = ('日', '月', '火', '水', '木', '金', '土'); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1; return ("$year年$mon月$mday日($youbi[$wday]) $hour時$min分$sec秒"); }
■csv2jsa.ini
#--------------------------------------------------------------------
# Content-Type指定 @ctype = ( 'text/javascript', 'text/plain' );
# 標準出力形式(@ctype の何番目か) $vmode = 0;
# 指定なし時の配列名 $aname = 'CSV_DB';
# サンプルデータ $fcsv = 'sample.csv';
# エラーメッセージ @emsg = ( 'parameter is not right.', #パラメータ不正エラー 'file open error.', #ファイルオープンエラー '' );
#-------------------------------------------------------------------
1;
■sample.csv
"sample1","sample2","sample3"
使い方としては、Webページで
<SCRIPT type="text/javascript" src="http://〜CGIのURL/csv2jsa.cgi?data=CSVデータ&name=配列名"></SCRIPT>
としてあげると、JavaScriptの配列(二次元配列)として受け取れます。
パラメータは以下のようになってます。
data:CSVファイルのURL(条件付で省略可)
CGIから見た相対パスで指定。http://は不可。
基本的に省略しないほうがいいけど、iniファイルのサンプルデータの部分を書き換えれば、パラメータ無しで受け取る事も可能。
name:配列名(省略可)
省略した場合はiniファイルで指定した配列名になる。
mode:出力形式(省略可)
受け取りデータのContent-typeを指定。0および省略時はJavaScript(text/javascript)として、1の場合はJavaScript記述のテキスト(text/plain)として出力する。
mode=1 とすればプレーンテキストとして受け取れるので、ブラウザから直接CGIを呼び出して正常に配列になっているかの確認が出来ます。
こんな感じ:sample.csv(テキスト表示モード)
まだまだ色々問題点があるけど、とりあえず使えるようになったから、Webページのほうも徐々に変更して行こうかなっと。
|