ファイルが消える(読めていない?)

このQ&Aのポイント
  • 指定番目のレコードを削除するcgiを作成しています。ロジックは簡単で、指定があれば実際の削除作業を行い、指定がなければ削除位置を指定させる画面表示を行います。
  • 最近、削除位置を指定させる画面表示でも「全レコード数」を表示したいと思い、ロジックを変更しました。しかし、削除作業ではない方でレコードが消えてしまいました。
  • 読み込んだデータは一時的にサーバー上に保存されているため、移動ではなくコピーを行うと問題なく動作しました。
回答を見る
  • ベストアンサー

ファイルが消える(読めていない?)

お世話になります。 早速ですが、 xファイルから指定番目のレコードを削除するcgiを作成しています。 ロジックは簡単で、 指定があれば実際の削除作業(a-rtn)、 指定がなければ(初期状態)削除位置を指定させる画面表示(b-rtn)を それぞれ実行するようなロジックです。 問題なく動いていましたが、 これまではa-rtnでのみ「全レコード数」を表示していたのですが、 このほど、b-rtnでも「全レコード数」表示したいと思い手を加えました。 実際にやったことは、a-rtnにあった下記の部分をb-rtnへ移動しただけです。 (初めに読んでおけば残っているので、後で使えると思っての対応です) open(IN,"$file") || &error("Can't open $file"); @lines = <IN>; close(IN); $kensu = @lines; #全体件数 ところが作業をしてみると、 b-rtnでは「全レコード数」が表示されましたが、 a-rtnではレコードが無くなっていました。 (と言うより、読めていないのかなと思っています) 状況は以上ですが、 @linesに読み込んだデータは残っていると思っているのですが、 一度サーバーに帰ると消えてしまうのでしょうか。 移動ではなく、コピーにしたら問題なく稼働しています。 分かりにくい質問かと思いますが宜しくお願いします。

  • CGI
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.1

Perl中の変数の内容は、現在の要求の HTML を出力し終った時点で無くなります。 出力したHTMLに対して閲覧者が次に操作を行なった時、前回の処理結果はもはや利用できません。 これで、答えになっていますか?

nagahaha
質問者

お礼

早速有り難うございました。 やはりそうでしたか。 十分なる回答です。 この回答で充分なのですが、 ついでにお聞きします。 今回のようなケースはa-rtn、b-rtnでそれぞれ読めば良いのですが、 a-b間をデータ引き渡しなどしたい場合は、 ファイルを一旦出力して読むという手段が当たり前なのでしょうか。 何か良い考え方があれば教えていただきたいのですが。 宜しくお願いいたします。

その他の回答 (1)

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.2

> ファイルを一旦出力して読むという手段 これは、最後の手段ですね。 なぜかと言うと、大変な処理になるからです。 CGI と言うものは、複数の閲覧者から前後してあるいは同時にアクセスされる状況を想定せにゃなりません。 閲覧者対応に一時ファイルを管理したり用済みの一時ファイルを消す処理は、かなり大変です。 ではどうするかと言うと、条件によって複数の方法を使い分けます。 記憶すべきデータの容量(バイト数)が多い場合には、一見無駄な様でも再度データを作り直すのが良いでしょう。 容量が少い場合は、CGIパラメーターとか Cookie とかを使います。 CGIパラメーターというのは、URL末尾の「?」以降の部分です。 FORMを使ってるなら、 <input type="hidden" name="aaa" value="bbb"> とか書きます。 Cookie は、CGIパラメーターに慣れてからの方が良いかと。

nagahaha
質問者

お礼

何回も有り難うございます。 確かにそうですね、 言われてみるとよく分かります。 誰に対してもサーバーに書き込んでいたら飛んでもなくi/oが発生します。 何気なく(知らないで、そういうモノだと言うことで)使っていましたが、 FORMが解決していたのですね。 少なくともやりとりする部分を最小にすることが設計の初めと言うことですね。 よく分かりました。 お世話になりました。

関連するQ&A

  • TXTファイルに文字を入れ込む事が出来ない

    下記のような方法でファイルを書き込みたいと思っていますが、書き込まれずにいつまで立っても白紙のままです。 どうかご指摘頂けないでしょうか? お願いします。 $in_file = "oyamanew.txt"; if ( !open( IN_FILE, "+<$in_file") ){ print "INファイルのオープンに失敗しました。"; exit; } @record = <IN_FILE>; $record[0] = "$ROWKDATA[3]\n"; seek( IN_FILR, 0, 0 ); print IN_FILR @record; truncate( IN_FILE, tell( IN_FILE ) ); close( IN_FILE );

  • ファイルopenについて

    1----------------------------------- open(IN,">$past_file")|| &error; @lines2=<IN>; close(IN); >は書き込みopenということですが、この使い方で一応読み込みはできます。しかしやはり使い方としては間違っているのでしょうか?OSによってはできないとか・・ というのも、ないファイルをOPENするとき、読み込みではファイルはopenできませんよね。書き込みでopenすれば、ないファイルを自動で作成してくれます。今作っている掲示板だとこれは都合がいいので、こういう風に記述したいのですがだめでしょうか。

    • ベストアンサー
    • Perl
  • textファイルについて

    あるディレクトリーに test.txt aaa.txt があるのですが、 二つのテキストを開いて もし text.txtの3行目に http://www.goo.ne.jp/ があり aaa.txtの10行目にも http://www.goo.ne.jp/ があるとすれば aaa.txtの10行目を消したいのですが、 そんな事って可能ですか?? 色々考えたのですが、aaa.txtの10行目を消す時に 10行目を空にすると言う指定が出来なくて困ってます。 どうしてもaaa.txtの削除が出来ません。 参考までにスクリプトを載せておきます <?php $file_name = array("aaa.txt", "test.txt"); $list = fopen($file_name[0], "a+"); $delete_list = fopen($file_name[1], "r"); $listfile = file($file_name[0]); $listmax = count($listfile); $listfile = file($file_name[1]); $delete_listmax = count($listfile); if ($delete_listmax > 0){ for ($delete_line = 1; !feof($delete_list); $delete_line++){ $delete_lines = fgets($delete_list); $delete_lines = trim($delete_lines); if ($delete_lines){ if (is_file($file_name[0])){ for ($line = 1; !feof($list); $line++){ $lines = fgets($list); $lines = trim($lines); if ($lines){ if ($delete_lines == $lines){ //ここの部分がわからないです fputs($list, "あああ"); echo "O,K\n"; } } } } } } } fclose($delete_list); fclose($list); echo "\n終了\n"; ?> 詳しい方がいましたら宜しくお願いします

    • ベストアンサー
    • PHP
  • さっぱり分からず困ってます。。

    読み込むテキストファイルは下記のとおりです。 <100>  A xxx  A ddd  A ccc  A vvv  B zzz //200//  A xx1  A dd1  A cc1  A vv1  A zz1 ・300  A 3xx  A 3dd  A 3cc  A 3vv  A 3zz 上記のテキストファイルから、100,200,300のキーワードで該当箇所から 次行を表示するプログラムを考えています。 下記のプログラムで実行すると、取得できるのですが、何度も繰り返し出力します。 1回で良いのですが、何度も繰り返す処理を記載しているつもりが無いのに、何故繰り返すのか意味不明で困ってます。 どうすれば、修正できるでしょうか。。 import re def extract_text_in_file(filepath, pattern_prev, pattern_next): '空のリスト生成' extracted_text_array = [] '抽出したい範囲' pattern = pattern_prev + '(.*)' + pattern_next 'ファイルオープン' with open(filepath) as f: lines = f.readlines() '改行削除、文字列に変換' lines_strip = [line.strip() for line in lines] lines_strip = "".join(lines_strip) '文字列lines_stripから抽出範囲を取得し、リストに追加' for i in lines_strip: tmp_extracted_text_array = re.findall(pattern, lines_strip) extracted_text_array.extend(tmp_extracted_text_array) return extracted_text_array path = 'C:\\Users' file_name = '/' + '***.txt' target = path + file_name pa_prev = '100' pa_next = 'B' x = extract_text_in_file(target,pa_prev,pa_next) print(x)

  • 1ファイルずつ読み込みたい

    ウィンドウズ環境でactive perlを利用しています。 あるディレクトリーの中に2000位のファイルが入っており、このファイルを読み込んで置換処理を行うため下記のようなperlを作っています。 1ファイルはおおよそ3000行くらいです。 foreach(<*.html>) { open(IN_FILE, $_) || die; open(OUT, ">$_.tmp") || die; @record=<IN_FILE>; foreach $record (@record){ $record =~s/aaa/bbb/isg; } print OUT @record; close( IN_FILE); close( OUT); rename("$_.tmp", $_) ; } 当たり前かもわかりませんが、メモリー不足になり処理が中断します。 ディレクトリーの中のファイル数を600程度に少なくすると処理が完了します。 そこで質問なのですが、ディレクトリーの中のファィルを一度に全部読み込まず、1ファイルずつ順次読み込んでいくことはできないでしょうか。 最初の1行目のforeachをwhileに変えたりしたのですがうまくいきません。 対応策あればご教示ください。

    • ベストアンサー
    • Perl
  • 行き詰ってます。。

    'ファイルをオープン' with open(target_file) as f: lines = f.readlines() '改行を削除' lines_strip = [line.strip() for line in lines] lines_strip = "".join(lines_strip) '検索' keyword = input() position = lines_strip.find(keyword) #ここで、keywordと一致する文字の場所が分かる。 ここからですが、その後、A xxx A ddd A ccc A vvv B zzz と続きます。 ※実現したいこと。 A xxx A ddd A ccc A vvv B zzz Bを検出したら終わり。というプログラムを記載したいのですが、 どのように書けばよいでしょうか?

  • 制限を無くしたいのですが

    いつもお世話になっております。 また初歩的な質問ですが宜しくお願いします。 掲示板をつくったのですが。件数を20までと指定してしまっています。この件数の制限を無制限にしたいのですが、いまいちうまくいきません。 ------------------------ RECORD_MAX=20;#最大レコード数  ・  ・  ・ open(DATAFILE,">$DATA_FILE_NAME"); print DATAFILE $rec; for($num=0; $num<$RECORD_MAX -1; $num++){ print DATAFILE $lines[$num]; } close(DATAFILE); } ------------------------ 上記です。少々内容を省いた上、みにくくて申し訳ないのですが、 ご助言&プログラムの追記等をお願いできないでしょうか?お願い致します。

    • ベストアンサー
    • Perl
  • ファイルの一部を別のファイルの指定箇所にかき込みたい

    Perl初心者です アルファイルの一部を別のファイルの指定箇所にかき込みたいのですが、どのようにすればいいのか分かりません。 ファイルAにはデータが1行に1つ入っています。それをファイルBの指定した場所にかき込みたいです。 ファイルBはテキストファイルで 1:3年AaaaA組 2:今週の担当はAbbbA 3:月曜日の1限目はApppA 4:担当の先生はAqqqA 5:持ってくるものはArrrA 6:月曜日の2限目はAsssA 7:担当の先生はAtttA 8:持ってくるものはAuuuA という具合です。 以下同様のものが数組繰り返します。 AファイルにはA***Aの部分にかき込みたい情報が1行づつのデータになっています。 いろいろ探してみて、見よう見まねで ************* #test.pl open(A, "<A.txt"); while (<A>) { @lines = <>; } open(B, ">B.txt"); while (<B>) { s/AaaaA/$lines[1]/g; s/AbbbA/$lines[2]/g; print B; } close(B); close(A); #end ********** こんなものをつくってみましたが、さっぱりダメでした。 WIN MEで ********* jperl test.pl > test.txt ********* こんなバッチファイルを作成して実行しています。 どなたかお力をお貸し願えるとありがたいです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • No such file or エラー。

    $lines=file("file1.txt"); print_r ($lines); とかくと、 Warning: file(file1.txt) [function.file]: failed to open stream: No such file or directory in C:\************************************* on line 51 と、なります。 とうぜん、何も表示されません。 line 51 は、確かに一番上の1行の位置なのですが・・・・。 せっぱ詰まっているせいか、なにがなんだから、分かりません。+w+; PHPと、file1.txtは、同じ場所に置いています。 ”ファイルが開けない”と言われているのは、分かるんですが・・・。 なにか、簡単な事だと、思うのですが、分かりません。 一応、Apache2.0.59/PHPは、4.4.4です。 レンタルしているサーバと同じような設定にしているので、変えることはできません。 文字コードは、EUCで統一しています。

    • 締切済み
    • PHP
  • データファイルのソート方法について

    perlで使用している、データファイルのソート方法について質問いたします。 やりたいこと。 1.ファイルを読み込み 2.指定されている文字列でソートをして 3.同じファイルに格納する 以上になります。 以下のファイルにデーターが入ってます・ namedata.cgi 田中,4 佐藤,2 鈴木,1 水野,3 このファイルをソートして以下のように並び替えて保存したいと思ってます。 スクリプトを実行後 namedata.cgi 鈴木,1 佐藤,2 水野,3 田中,4 となっていてほしいのです。 スクリプト sort.cgi 略・・・ #ふぁいる読み込み open(DB,"<$file") || &error("Can't write $file"); flock(DB, 1); @lines = <DB>; close(DB); #ソート @result = sort { $a <=> $b } @lines; #ファイル書き込み open(DB,">$file") || &error("Can't write $file"); flock(DB, 2); print DB "@result"; close(DB); ファイルの2項目目が分からないからソートされていないような気がするのですが、記述方法がわかりません。 ファイル読み込み時にforeachを使用して読み込まないとだけなのでしょうか? うまく説明できていないかもしれませんが、よろしくお願いいたします。

    • ベストアンサー
    • Perl