• ベストアンサー

ファイルを1行削除する

ゲストブックに削除機能を付けたいのですが、やり方がわかりません。 入力された番号と一致する行を探し出して、削除キーと入力された番号が 同じだったら削除、としたいのですが、ファイルの一行を削除する方法がわかりません。 どのように行えば良いのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

原始的ですが、以下の方針が考えられます。 ・ファイルの内容を一行ずつ読み込む  ・削除対象となる行かどうかのチェック   ・削除対象の行なら、次の行へ   ・削除対象でなければ、行の内容を変数に格納 ・全ての行をチェックし終えたら、変数に格納した  情報だけを元のファイルに上書きする。 これは、効率は悪いのですがとりあえず使えます。 ちなみに、Tempファイルを使う方式だと 「削除対象でなければ、行の内容を変数に格納」 しないで、ファイルに追記することになります。 (全部終わったら、Tempファイルと元のファイルを 置き換えて、Tempファイルを削除します)

Tsuboko
質問者

お礼

おおーなるほど('o'*) てっきりそのまま削除できるんだと思ってましたが、 まずそこから違うんですねー とても勉強になりました^^ どうもありがとうございます<(__)>

その他の回答 (1)

  • longname
  • ベストアンサー率28% (18/64)
回答No.2

おそらく読み出すときは1行づつ読み出して配列に入れていると思います。それを利用する場合はforeachなどで配列の要素一つ一つに対して処理を行います。 削除するときは、foreachで該当する番号と一致するかどうか要素をひとつひとつ比較し、一致しない場合だけ、その要素を別の配列にいれます(push,unshift等)。 そしてその新しい配列をファイルに書き出せば該当行の含まれないファイルができます。 ログファイルが大きくなると、処理速度等が問題になるので工夫が必要でしょうが、直感的に分かり易く、他の処理とからめて応用は利くと思います。 別の方法として、ファイルから1行づつ読み出したとき配列ではなく番号をキーにしたハッシュに入れておくと、該当する番号をキーにもつ要素をdeleteによって削除できます。foreachで回す部分が減ってよさそうです。 具体的にはフリースクリプトや参考書が勉強になります。

参考URL:
http://allabout.co.jp/career/cgiperl/
Tsuboko
質問者

お礼

ありがとうございます^^ とりあえず今は勉強段階なので、上の方法でやってみようと思います。 理解できるようになってきたら下の方法も試してみますね(^▽^)ノ

関連するQ&A