CSVファイルの使い方
[HOME] [BACK] [NEXT]「Simple Search Engine」という昔作ったCGIプログラムを例に解説します。
「Simple Search Engine」は登録されたサイト情報データをキーワード検索し、
ヒットしたサイト情報をリスト表示する、登録型の検索エンジンプログラムです。
プログラム構成は、サイト情報を登録する時に使う「igaadd.cgi」、検索を受け持つ「igasrch.cgi」、
登録情報の管理をするための「igamente.cgi」の3つです。
「igaadd.cgi」は「登録者名前,E-Mail,登録サイト(又はファイル)タイトル,サイト(又はファイル)のURL,バナーURL
,バナー幅(ピクセル),バナー高(ピクセル),サイト(又はファイル)説明 」の計8種のデータをPOSTで受け取りCSVファイル
(カンマ区切り型テキストファイル)に保存します。
「igasrch.cgi」は検索キーワードをPOSTで受け取るとCSVファイルを開いて、正規表現による文字列マッチングでヒットした
情報のみをリスト形式のhtml文にしてブラウザに返します。
ここではCSVファイルの一般的な使い方について説明します。
1.CSVファイル構造
「Simple Search Engine」の情報ファイルは1個で、1つの情報レコードには、大中小それぞれのカテゴリ番号
を表す3つの番号と上記8個のデータの計11個データが含まれており、
個々のデータはカンマで区切られています。
また、各レコードを1行としています。つまりレコード間は改行文字で区切られています。
--ファイル例--
0,100,203,XXXX´s Private House,CGIプログラムの作り方<BR>イントラネット用フリーCGI<BR>インタラクティブなホームページの作り方,http://www.webkoza.com/,,,,XXXX,XXXX@YYYY.or.jp,1999年6月24日(木) 01:04:21
1,104,211,FIRJ´ Free Internet Resources Japan 無料インターネット資源,フリーサイトの情報満載のページ<BR>ここの掲示板は大変貴重です。,http://www.geocities.com/Tokyo/Towers/7749/,,,,ZZZZ,XXXX@YYYY.or.jp,1999年6月19日(土) 22:40:52
ファイルの中にタグ<BR>が含まれているのは、ブラウザで入力されたデータの中に改行が有った場合これを<BR>タグ に変換してから保存しているためです。これによりヒットしたレコードをブラウザに表示する際そのままprintするだけでブラウザ上で改行させる事ができます。
2.ファイルへのデータ保存
以下に「igaadd.cgi」のソースの一部を紹介します。
$w_string=join(´,´,@inp_string); open DFILE,">>$datfile" or die "Cannot Open $datfile :$!"; #追加書き込み用 flock DFILE,$EX_LOCK; print DFILE "$w_string\n"; flock DFILE,$UNLOCK; close DFILE;
@inp_stringは大中小のカテゴリ番号3個、POSTで送られてきたデータ8個が格納されているリストです。
このリストの各要素間に「,」を挿入しているのがjoin関数です。perlではリストに代入したデータを共通の
区切り文字で結合するためにこの関数が多用されます。
こうして組み立てられたレコードの最後に改行「\n」を付加してから、
追加書き込みモードで開いたファイルに保存しています。
3.ファイルからの読み出しとレコード要素の取り出し
以下に「igasrch.cgi」のソースの一部を紹介します。
open DFILE,"<$datfile" or die "Cannot Open $mfile :$!"; #読み込み用 flock DFILE, $EX_LOCK; while(){ s/\n//g; $r_org=$_; @r_work=split(',',$r_org); (..キーワードと各レコード要素との文字列マッチング処理..) }
ファイルを読み込み専用モードで開いた後、while文で1行づつ読み込んでいます。
<(ファイルハンドル名)>は、
ファイルから1行読み込むというperl言語の記述です。<(ファイルハンドル名)>は
ファイルの最後でfalse
となりますからこのwhileループはファイルの最後までいって終わります。
whileループ中の最初の行は、「s/正規表現/置換文字列/」という置換演算子を使って、「\n(改行文字)」を
「ヌル」に置き換えています(つまり取り除いています)。
g修飾子はマッチするもの全て見つけるという意味です。
次にsplit関数で「,」で区切られているデータを分解して@r_workというリストに代入してします。perlでは、共通の
区切り文字で結合されたデータを分解するのにこの関数が多用されます。