#!/usr/local/bin/perl # # このcsvedit.txtはcsvedit.cgiに名前を変更してからご利用ください。 #---------------------------------------------------------------------------- # CSV EDITOR (FreeSoft) v1.00 for SJIS # (c)www.rescue.ne.jp #---------------------------------------------------------------------------- # 配置構成 # | # |-- csvedit.cgi <755> # |-- 編集するファイル.csv <666> # |-- backup.dat <666> ... バックアップファイル(空のファイルを用意) # |-- jcode.pl <644> # 使用上の注意 # # 1. カンマ区切りのデータ foo,bar,... のみ処理可能. "foo","bar",... 形式は編集できない. # 2. データに<>",を扱っているファイルの編集はできない. # 3. 編集するファイルは、他からのアクセスができないようにしてから作業すること. # 4. サーバ上のデータはこまめにローカルバックアップをすること. # 5. 自動バックアップファイルは書き換え毎に追加記録されるので、サイズに注意. # [History] # 1.00 04/JUL/1999 初版 #---------------------------------------------------------------------------- #●項目名 @table = ( '', 'DATE', 'NAME', 'EMAIL', 'SEX', 'AGE', 'HANDLE', 'PREF', 'REM', ); #●1画面に表示する行数 $page = 10; #●日本語コード変換ライブラリ require './jcode.pl'; #●編集対象となるファイル $file = './data.csv'; #●バックアップ用ファイル $backup = './backup.dat'; #●表示順 (0:正順/古い順 1:逆順/新着順) .. 新規記録はこれに関係なくデータの後ろに追加される $rev = 1; #---------------------------------------------------------------------------- ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); @wday_array = ('日','月','火','水','木','金','土'); $date_now = sprintf("%04d年%01d月%01d日(%s)%02d時%02d分%02d秒",$year +1900,$mon +1,$mday,$wday_array[$wday],$hour,$min,$sec); if ($file eq '') { &error("File Not Found","編集するファイルが指定されていません."); } if (!-e "$file") { &error("File Not Found","$fileが見つかりません."); } if (!open(IN,"$file")) { &error("File Not Open","$fileを開くことができません."); } @BASE = ; close(IN); @check = grep(/[<>"]/,@BASE); if (@check) { &error("Don't edit","<>"が含まれているデータがあるので編集できません."); } if ($rev) { @BASE = reverse @BASE; } if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); $value =~ s///g; $value =~ s/"//g; $value =~ s/\n//g; $value =~ s/\r//g; $value =~ s/\,//g; if ($value =~ /^(-EDIT-|-NEW-)$/) { $edit_num = $name; $EDIT = 1; } if ($value =~ /^(-DEL-)$/) { $delete = $name; $DELETE = 1; } if ($name eq 'key') { push(@EDIT,$value); } else { $FORM{$name} = $value; } } if ($EDIT) { &edit($edit_num); } elsif ($DELETE) { &delete($delete); } elsif ($FORM{'action'} ne '') { ®ist(@EDIT); } $start = $FORM{'start'}; if ($start eq '') { $start = 0; } $to = $start + $page - 1; if ($to > $#BASE) { $to = $#BASE; } &html($start,$to); exit; sub html { local ($start,$to) = @_; $next = $to + 1; if ($next > $#BASE) { $next = ''; } print "Content-type: text/html\n\n"; print <<"EOF"; $file

EDIT $file

新規登録

EOF foreach (@table) { if ($_ eq '') { $_ = '(未定義)'; } print "\n"; } print <<"EOF"; EOF foreach $num ($start .. $to) { $BASE[$num] =~ s/\n//g; (@item) = split(/\,/,$BASE[$num],$#table +1); $num2 = $num + 1; $border++; if ($border % 2 != 0) { $bgcolor = "bgcolor=#ffeedd"; } else { $bgcolor = ""; } print <<"EOF"; EOF foreach (@item) { print "\n"; } print <<"EOF"; EOF } print <<"EOF";
編集$_削除
$_

EOF if ($next ne '') { print <<"EOF";
EOF } print <<"EOF";

[更新]

※注意

EOF exit; } sub edit { local ($target) = @_; if ($target eq '-NEW-' || $target > $#BASE) { $FORM{'restart'} = 0; } if ($target ne '-NEW-') { $line = $BASE[$target]; $line =~ s/\n//g; @items = split(/\,/,$line); } else { $target = 'ADD'; } print "Content-type: text/html\n\n"; print <<"EOF"; $file

NEW/EDIT $file

EOF foreach $num (0 .. $#table) { $size = length($items[$num]) + 10; if ($table[$num] eq '') { $table[$num] = '(未定義)'; } print <<"EOF"; EOF } print <<"EOF";
項目名 編集前の状態 編集フォーム
$table[$num] $items[$num]

[編集をやめる]

※注意

EOF exit; } sub regist { local (@EDIT) = @_; if ($FORM{'action'} eq 'ADD') { @NEW = @BASE; $write = join ',', @EDIT; if ($rev) { unshift(@NEW,"$write\n"); } else { push(@NEW,"$write\n"); } } else { foreach $num (0 .. $#BASE) { if ($num == $FORM{'action'} && $FORM{'action'} ne 'ADD') { $write = join ',', @EDIT; $BASE[$num] = "$write\n"; } push(@NEW,$BASE[$num]); } } if ($rev) { @NEW = reverse @NEW; } if (!open(OUT,"> $file")) { &error("File Not Open","$fileを開くことができません."); } if ($rev) { print OUT @NEW; } if ($FORM{'action'} eq '-NEW-') { $write = join ',', @EDIT; print OUT "$write\n"; } if (!$rev) { print OUT @NEW; } close(OUT); if (!open(IN,"$file")) { &error("File Not Open","$fileを開くことができません."); } @BASE = ; close(IN); if (open(OUT,">> $backup")) { print OUT "-- $date_now ----------\n"; print OUT @BASE; print OUT "\n"; close(OUT); } if ($rev) { @BASE = reverse @BASE; } } sub delete { local ($delete) = @_; foreach $num (0 .. $#BASE) { if ($num == $delete) { next; } push(@NEW,$BASE[$num]); } if ($rev) { @NEW = reverse @NEW; } if (!open(OUT,"> $file")) { &error("File Not Open","$fileを開くことができません."); } print OUT @NEW; close(OUT); if (!open(IN,"$file")) { &error("File Not Open","$fileを開くことができません."); } @BASE = ; close(IN); if (open(OUT,">> $backup")) { print OUT "-- $date_now ----------\n"; print OUT @BASE; print OUT "\n"; close(OUT); } if ($rev) { @BASE = reverse @BASE; } $FORM{'start'} = $FORM{'restart'}; } sub error { local (@msg) = @_; local ($i); print "Content-type: text/html\n\n"; print <<"EOF"; ERROR

$_[0]

EOF foreach $i (1 .. $#msg) { print "$msg[$i]
\n"; } print <<"EOF";

[前の画面]

EOF exit; }