• 締切済み

データの上書き、追加

はじめまして。 perl初心者です。 TSVデータがあり、 TSVデータの一列目と入力された値が等しい場合は上書き、入力されたデータが一列目に存在しない場合は追加書き込みを行うプログラムを書いています。 以下のように書いてみたのですが、エラーはなく動きません。 アドバイスお願いします。 $scheduleFile2 = qq($form{"mon"}.tsv); unless(&serchFile($scheduleDir,$scheduleFile2)){ &makeFile("$scheduleDir/$scheduleFile2"); } @logs = (); open(FH,"+<$scheduleDir/$scheduleFile2"); # 読み込み処理 @logs = <FH>; close(FH); $data01 = $form{"code"}.$form{"date"}; $data2 = $form{"area"}; $data3 = $form{"prefecture"}; $data4 = $form{"date"}; $data5 = $form{"open_state"}."\n"; foreach $line (@logs){ ($corddate,$erea1,$ken,$hiduke,$corse1) = split(/\t/,$line); $data01 = $form{"code"}.$form{"date"}; if($corddate eq $data01){ # データの上書き $logs = qq($corddate\t$data2\t$data3\t$data4\t$data5); open(FH,">$scheduleDir/$scheduleFile2"); print FH @logs; flock(FH,8); close(FH); } else{ # 一番最後の行に追加 $data01 = $form{"code"}.$form{"date"}; $data2 = $form{"area"}; $data3 = $form{"prefecture"}; $data4 = $form{"date"}; $data5 = $form{"open_state"}."\n"; #$logs = qq($data01\t$data2\t$data3\t$data4\t$data5); open(FH,">>$scheduleDir/$scheduleFile2"); print FH $logs; flock(FH,8); close(FH); } }

みんなの回答

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.3

遅くなって申し訳ありません。 ANo.1です。 >>1.ファイルはSubで作るけど、最初の一回は元データが空なので、その場合の処理が無いような・・・ >どういう意味でしょうか? ファイルが存在しない場合サブルーチンでファイルを作成するような処理が書かれてありますが、その場合無条件でデータを追加書き込みしなければならないはずです。 最初の処理ではファイルは空の筈ですので 「 foreach $line (@logs)」の中身がすっぽりと未処理になるのではという意味です。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

その変更したあとのやつだと, 読み込んだデータは全部 @DATA に入って @logs には入らないですよね? なんというか, 1.データを全部ハッシュに取り込む 2.ハッシュのデータを変更する 3.ハッシュにあるデータを全部ファイルに書き出す くらいかなぁ?

全文を見る
すると、全ての回答が全文表示されます。
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.1

1.ファイルはSubで作るけど、最初の一回は元データが空なので、その場合の処理が無いような・・・ 2.したから7行目の変数「logs」への代入がコメントアウトになっているのはなぜでしょうか?

maedai
質問者

補足

>1.ファイルはSubで作るけど、最初の一回は元データが空なので、その場合の処理が無いような・・・ どういう意味でしょうか? >2.したから7行目の変数「logs」への代入がコメントアウトになっているのはなぜでしょうか? ごめんなさい。こぴぺミスです。 ちょこっと変えました。 $scheduleFile2 = qq($form{"mon"}.tsv); unless(&serchFile($scheduleDir,$scheduleFile2)){ &makeFile("$scheduleDir/$scheduleFile2"); } @logs = (); open(FH,"+<$scheduleDir/$scheduleFile2"); flock(FH,2); while(<FH>){ $_ =~ s/\r//g; $_ =~ s/\n//g; chomp; push(@DATA,$_); } # 読み込み処理 @logs = <FH>; $data01 = $form{"code"}.$form{"date"}; $data2 = $form{"area"}; $data3 = $form{"prefecture"}; $data4 = $form{"date"}; $data5 = $form{"open_state"}."\n"; $data_new = qq($data01\t$data2\t$data3\t$data4\t$data5); foreach $line (@logs){ $data01 = $form{"code"}.$form{"date"}; chomp($line); #($corddate,$erea1,$ken,$hiduke,$corse1) = split(/\t/,$line); if((split(/\t/,$line))[0] eq $data01){ # データの上書き push(@logs, $line); print FH $line; } else{ # 一番最後の行に追加 $data01 = $form{"code"}.$form{"date"}; $data2 = $form{"area"}; $data3 = $form{"prefecture"}; $data4 = $form{"date"}; $data5 = $form{"open_state"}."\n"; $data_new = qq($data01\t$data2\t$data3\t$data4\t$data5); print FH $data_new; } } truncate(FH,0); seek(FH,0,0); flock(FH,8); close(FH); それでもうまくいかないです・・。 アドバイスお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • TSVデータを上書きしたい

    はじめまして。 CGI初心者です。 データの上書きがしたいのですがなかなかうまくいかなくてこまっています。 以下のソースは追加書き込み処理には成功しています。 以下に何を施せば上書きがうまくいくのかアドバイスをお願いします。 $scheduleFile2 = qq($form{"mon"}.tsv); # 読み込み処理 open(LOG,"$scheduleDir/$scheduleFile2"); @logs = <LOG>; close(LOG); foreach $logs(@logs){ ($golfdate,$areada,$ken,$date2,$para)=split(/\t/,$logs); } # 読み込み処理 # 書き込み処理 unless(&serchFile($scheduleDir,$scheduleFile2)){ &makeFile("$scheduleDir/$scheduleFile2"); } @DATA = (); open(FH,"+<$scheduleDir/$scheduleFile2"); flock(FH,LOCK_EX); while(<FH>){ $_ =~ s/\r//g; $_ =~ s/\n//g; # 行の末を削除する chomp; push(@DATA,$_); } $data01 = $form{"code"}.$form{"date"}; $data2 = $form{"area"}; $data3 = $form{"prefecture"}; $data4 = $form{"date"}; $data5 = $form{"open_state"}."\n"; $data = qq($data01\t$data2\t$data3\t$data4\t$data5); print FH "$data"; flock(FH,8); close(FH);

    • 締切済み
    • CGI
  • 行頭に変なスペースが…

    入力したデータをログファイルの一番上に入れたいために以下のようにしました。 open(FH2,"***.log"); flock(FH2,2); @files = <FH2>; flock(FH2,8); close FH2; open(FH,">***.log"); @filew = "user=$FORM{'name'}<>TIME=$FORM{'TIME'}\n@files"; print FH @filew; close(FH); こうするとなぜかログファイルの2行目以降の頭にスペースが1文字分入ります。 2個目のログファイルオープンの3行目 print FH @filew; のスペースが原因かと思い、 print FH@filew; としてみましたが、やっぱりスペースが入りました。 このスペースを入らないようにするにはどうしたらいいでしょうか?

    • ベストアンサー
    • Perl
  • 新しいログの書き込み

    新しいログを追加で上に書き込む方法はどのようにしたらよいのかアイディアがありません。 ご教授願います。 if($mode eq "html"){ flock(FH, LOCK_EX); open(FH,"${datafile}"); @html = <FH>; close(FH); flock(FH, LOCK_NB); $html = join('',@html); @html = split(/$chtml/ , $html); $html[1] = $data; $html = join($chtml,@html); flock(FH, LOCK_EX); open(FH,">$datafile"); print FH $html; close(FH); flock(FH, LOCK_NB);

  • ログファイルを削除するcgiプログラム

    ログファイルを削除するcgiプログラム -------------------- $GYOUSUU = $FORM{'GYOUSUU'}; #--- ログファイルオープン open(FH,"***.log"); flock(FH,2); @FILES = <FH>; flock(FH,8); close FH; undef $FILES[$GYOUSUU]; open (FH2,">***.log"); @filew = "@FILES\n"; print FH2@filew; close(FH2); -------------------- となっているのですが、修正後にログファイルの行の頭に、半角スペースが入ってしまいます。 どこを修正すればいいのでしょうか?

    • ベストアンサー
    • Perl
  • 受信データの分割

    @atai = split(/&/,$buffer); foreach $atais(@atai){ ($key, $value) = split(/=/, $atais); $FORM{$key}=$value; } 多分上記のようなことをすればできるのだと思うのですが、 自分の力でコードをかきたくて、1行ずつかいてみました。 #ファイルオープン open FILE,"<log.log"; flock(FILE,2); @log_data=<FILE>; flock(FILE,8); close FILE; foreach(@log_data){ (@log) = split(/=/,$_); } foreach(@log){ ($log_data) = split(/&/,$_); } foreach($log_data){ ($key,$value) = split(/=/,$_); } $FORM{$key}=$value; このようにかいてみたのですがうまくいきません。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • perlでのデータ処理について

    みなさんこんにちは、今、perlについてとても困っています。 以下に内容を記載しますので、わかる方がいましたら 良きアドバイスをお願いします。 #使用するファイルは2つです。 #元データ=$files1 #送信データ=$files2 #データの一行処理開始 open(IN,"$files2") || &error("$files1を開けません。"); while (<IN>) { ($no,$id,$mail,$type,$data)=split(/,/); # $files2を一行づつ読み込んで送信処理をしていきます。 . . . . . #ここからが問題点です。 # $files2を一行読み込んで送信が終わったら、$files1へ送信履歴として、 #日付を入力します。以下にスクリプトを記載しますので、良きアドバイスを #お願いします。 &get_date; @logs=(); @new=(); open(LOG,"$files1") || &error("$files1を開けません"); @logs = <LOG>; close(LOG); foreach $log (@logs){ @all_data = split(/,/,$log); if ($all_data[0] eq $id){ # $idは$files2から読み込んだ数値です。 $shori_date="$year\/$w_mon\/$w_mday"; $all_data[33]="($shori_date)($hour:$min)"; for ($i=0; $i<@all_data; $i++){ $work.="$all_data[$i],"; } chop $work; push(@new,$work); }else{ push(@new,$log); } } open(ALL,"+< $files1") || &error("$files1に書き込めません"); flock(ALL,2); truncate(ALL,0); seek(ALL,0,0); print ALL @new; close(ALL); #ここまでです。 #このようにすると、日付は入るのですが、データの更新、書き込みされたファイルを見ると #同じ内容が、2重、3重にコピーされて、ファイルに書き込みされてしまいます。 } close(IN); 以上なのですが、良きアドバイスを教えて下さい。

    • ベストアンサー
    • Perl
  • ログファイルへの書き込みがうまくいきません

    ------------------------------------------ open(LOG,"+<$filename") || die "Error!\n"; @logs=<LOG>; flock(LOG,2); unshift(@logs,"$array[0],$array[1],$array[2],$array[3],$array[4]\n"); print LOG @logs; flock(LOG,8); close(LOG); ------------------------------------------ この$array[0]~$array[4]にはそれぞれ、「<option value="1">1</option>」の様な、プルダウンメニューの「1~10」までの数字が入っています。 この数字を$filenameへ書き込みたいのですが、中々うまくいかずに困っています。 ちなみに、一応書き込めるには書き込めるのですが、$filenameを開くと、 ------------------------ 1,1,1,1,1 6,4,1,9,6 1,1,1,1,1 9,1,2,4,4 1,1,1,1,1 3,0,1,9,5 1,1,1,1,1 ------------------------ このような形になってしまいます。何がいけないのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perlを利用してテキストファイルのデータを読み込み・書き出し

    今作成しているのは、WEB上で仕事の情報をメンテナンス出来るシステムです。HTMLとPerlを利用しています。 その際に、データをテキストファイルにタブ区切りで随時書き込んだり、読込んだりする事でその内容をフォーム上に表示させたりしています。動作はしているのですが、問題が出てきました。1行単位で書き出したり読込んだりしているのですが、最近データ数(件数)が増えてきましたので、処理に時間がかかり書き出しの途中で他のページに切り替えると途中までしかデータが書き出されません。いろいろなパソコンでこのシステムを利用するので、スペックの低いマシンでも、ある程度の処理の高速化を図り、なるべくこのような事が起きないようにしたいのですが良い方法はありますでしょうか。通常こういった形でシステムを作成する場合はどのような方法をとるのでしょうか?教えて下さい。掲示板はこのような仕組みで作られていると思いますが、データの数が多い場合はどのようなコードで作成されているのでしょうか? [コード一部] 各データは変数$data[$x]に取り込んでいます。 open(FH,">$filename"); flock(FH,LOCK_EX); for ($x=0;$x<=$count;$x++) { print FH $data[$x],"\n"; } flock(FH,LOCK_UN); close FH;

    • ベストアンサー
    • Perl
  • cgiログファイルの書き込みに余計なスペースが入る。

    ---------- #ここでログファイルに書き込みを行う。 open(FH,">>log.log"); print FH"ID=$ID&COUNT=$COUNT\n"; close(FH); #ログファイルをさらに開く。 open FILE, "<log.log"; flock(FILE,2); @log = <FILE>; flock(FILE,8); close FILE; ログファイルを並び替えてその順番で書き込み。 $gyou = @log; @sort=sort{(split(/&/,$b))[1] cmp (split(/&/,$a))[1];} @log; print "<FONT COLOR=RED>@sort</FONT><BR>\n"; open(FILE2, ">log.log"); print FILE2"@sort"; close (FILE2); ---------- というように行っていますが、一番最初のID=01&とかの前に半角スペースが入ります。 下の行に行くほどスペースが増えます。 どこが原因でしょうか?

    • ベストアンサー
    • Perl
  • アクセスカウンターでデータが削除されてしまう。

    プログラムのアクセスカウンターをするプログラムを作成しましたが、アクセスカウンターのデータが消去されてしまいます。 プログラム抜粋 (ここから) #アクセスカウンターカウント数計上ロジックを入れる $data = ""; open(IN11,"$countcsv") || &error(" countcsv をopen出来ません"); flock(IN11,1); while($lines11 = <IN11>) { ($seq,$acc) = split("\,", $lines11); if ($page == $seq) {$acc = $acc +1; } $data .= "$seq,$acc\n" } close(IN11); open(IN21,">$countcsv")|| &error(" countcsv をopen出来ません"); flock(IN21,2); print IN21 "$data"; close(IN21); (ここまで) count.csvの構成は以下のようになってます。 (ここから) 1,0 2,0 3,0 4,0 5,0 6,0 7,0 8,0 9,0 10,0 (ここまで) カウンターを計測するデータ(行数)が多いと、データが全てなくなってしまいます。 ファイルロックの方法に問題があると思ってますが、どこが悪いのかがわかりません。 ご教授いただけますと助かります。 よろしくお願いいたします。

    • ベストアンサー
    • Perl