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では、共通の 区切り文字で結合されたデータを分解するのにこの関数が多用されます。

[HOME] [BACK] [NEXT]

更新日: