CGI-BBS > データベース > CGI検索 > CSVデータの検索・追加がうまくできません


カレッヂ
カレッヂ


質問者 えるも  投稿日 6/2(土) 16:34:43
初めまして、こんにちは。CGI初心者です。すみません。
現在、データベース検索に挑戦しております。とりあえずWindows MeのDOSプロンプトでテストしています。HTTPの環境変数から取り出したあるデータをデータベースと照合し、一致すれば「登録済み」なければそのデータを新規に書き込むようにするCGIを作っているんですが、検索処理がうまくいかず、悩んでいます。

データベースをCSV形式にしたんですが、書き込み時、改行なし(print "$data,";)で書き込むとうまく検索できるのですが、改行あり(print "$data,\r\n";)だと変な結果になってしまいます。つまり、CSVのデータが一行で保存されているとOKで、データ毎に改行して保存されているとNGなのです。(chomp関数で改行を削除してもです…とほほ、なぜ?)

ちなみにCSVデータを配列変数に読み込んでforeach関数で繰り返し照合しています。
open(CSV,"<data.csv"); #CSVファイルオープン
@csv = <CSV>;          #配列変数に読み込み
foreach (@csv) {       #データの検索繰り返し
if (/$data\b/) {       #環境変数から取り出したデータ($data)とのマッチング処理
print "登録済み" ;      #マッチしたときの処理
exit;                  #処理終了
} else {               #マッチしないときの処理
open(CSV,>>data.csv"); #CSVファイルオープン(追加書き込み)
print CSV "$data,\r\n";#改行いれて書き込み
exit;                  #処理終了
}
}
とまあ、こんな感じで作ったのですが、どうもif文の処理がおかしくなって登録済みのデータでも書き込んでしまいます。でもCSVのデータが改行なしの1行であれば問題ないんです。
どういう違いがあるのでしょうか?
そもそもこのようなやり方自体、まずいのかもしれませんが、よくわからないので、どうかご教授下さい。お願いします。
回答者 よしお  [削除]  投稿日 7/5(木) 10:24:11
検索機能のパターンマッチの部分はよく分からないですが、僕もCSVデータベースを作成
しているときそういうことはありました。
どうも、
print CSV "$data\n";
として書き出すと、csv.datのデータの書き出し方が
***

***

って一行おきになるようなんです。対処法として
print CSV "\n$data";
ってするとうまくいきました。
僕もperl初心者なのでまだうまくはいかないですが。
参考までに。

あと、foreach関数よりwhile関数の方がいいみたいですよ。
foreach関数は膨大なキャッシュを使用するために、システム負荷が多い、
ってききました。
while (<CSV>){
   $line = $_;  ←環境変数から通常変数に代入。
   ...
}
って下方がいいのかな?

参考までに。参考にならないとは思いますが。
質問者 えるも  [削除]  投稿日 7/6(金) 10:38:38
回答ありがとうございます!いや〜随分前に質問出したんだけど回答が全然こないので正直あきらめてました。ほんと感謝です!早速ためしてみます。さて、僕の方は現在、mySQLによるデータベースにチャレンジしています。Perlもまだまだよくわかってないのに、ほんと無謀ですよね。とまあこんな僕ですが、これからもよろしくお願いします。m(__)m

このページは終了したので返信(回答)は書きこめません

Web裏技