WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:cgi/perlでのデータを指定して格納する方法

Ma-kun [WriteDate : Wed Dec 20 13:52:59 2000]

データをファイルに保存する場合、まとめて保存する方法は分かるのですが、あるデータを1つだけ追加して保存する場合、どのように指定すれば格納できるのでしょうか?
データはcsv形式で、保存名は・・・.datとしてあります。
例えば、あるコメントを32番目に格納しなさいという場合はどうするのでしょうか?教えてください。だいぶ、cgi/perlのことは分かってきたんですが・・・

ちゃいぱ [WriteDate : Wed Dec 20 14:39:38 2000]

ファイルの最後への追加書きは簡単でいいのですが、途中への追加は、新規ファイルになります。そして、追加後、ファイル名を元の名前にします。

たとえば、31番目まで、従来のファイルから新規ファイルへ書き込んで、つぎに32番目を任意で処理した後、従来の32番目以降をまた書き込み、最後に、新規ファイルを従来のファイル名にリネームする。

この処理中はもちろんファイルロックを忘れずに!

もしかしたら、他の方法もあるかもしれませんので、様子を見ましょう!

Nobu3 [MAIL] [URL] [WriteDate : Wed Dec 20 16:44:23 2000]

番号も一緒に書いて追加書きする、という手もあります。
ただ、読込むときの処理が多くなりますが・・・。

Ma-kun [WriteDate : Thu Dec 21 01:37:38 2000]

早速返事ありがとうございます。
この掲示板はとっても親切な人が多いので嬉しいです。
本題ですが、もしすべてのデータ数を30とします。
で、普通に書き込んでもらったデー多数が29として、30番目には
わざと空データをぶち込んで1つのファイルに保存します。
で、別ページから得たコメントを30番目に入れないさという
風にはできないのでしょうか?
ちゃいぱさん、Nobu3さんには毎度助言をいただきありがたいです。
また、よろしくお願いします。

バギンズ [MAIL] [URL] [WriteDate : Thu Dec 21 12:14:00 2000]

Perlの場合、処理を簡略化する為にテキストファイル全体を一括して配列に読み込み、一括して書き出す場合が多いです。
(1レコードのサイズが可変長でも可能だからという理由もあります)

もし、ファイルサイズが大きくてメモリ上に読み込むのに問題があるという事であれば、レコードサイズ(1行のサイズ)を固定にし、レコードサイズ×レコード位置をseekしてread/writeでアクセスすることが可能です。

Ma-kun [WriteDate : Thu Dec 21 13:46:00 2000]

バギンズさんどうもありがとうございます。
データの一部だけを指定して格納するのはあまりよろしくないのでしょうか?
たとえば、15人グループのサークルがあったとして、1人ずつ名前から住所などを登録し、
そのデータ数が10とします。そこにサークルの会長から1人ずつメッセージを
書こうとする場合、11個目にコメントとしてデータを保存する場合、
何か良い方法はありませんか?初期登録時はコメント用に11個目を空データとして保存し、
部長が書いたコメントが11個目に入るという形をとる場合。どうしたら良いですか?

バギンズ [MAIL] [URL] [WriteDate : Thu Dec 21 15:21:58 2000]

>データの一部だけを指定して格納するのはあまりよろしくないのでしょうか? 
というか、全部配列に読み込んで全部書き出す方が簡単です。

>11個目にコメント
同一ファイルに違う形式のレコードを持つ方法がいいかどうかは別として、それをやるなら会長のコメントを1行目にして、2行目以降に会員の氏名や住所を入れてはどうですか?

例えば、@userとかいう配列に
$user[0]は会長のコメント(初期時にコメントがないときは改行(\n)のみ)
$user[1〜]は会員の氏名や住所など。(最後に改行(\n)が必要)
を設定し、@userを丸ごとファイルに書き出せばいいだけです。
読むときもファイルから@userへ丸ごと読み込んで、@userを編集してから丸ごと書き戻します。

また、同一ファイルへ書き戻すと、書き込み途中でCGIが停止されファイルが壊れる可能性がある為、ちゃいぱさんが書いているように、一旦テンポラリファイルへ書き出し、全部書き終わったら正式なファイルへリネームするという方法を用いたりします。

Ma-kun [WriteDate : Thu Dec 21 17:09:16 2000]

分かりました。どうもありがとうございました。
参考になりました。
がんばってみます。
回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]