- 締切済み
データの上書き、追加
はじめまして。 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); } }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- ralf124c
- ベストアンサー率52% (232/446)
遅くなって申し訳ありません。 ANo.1です。 >>1.ファイルはSubで作るけど、最初の一回は元データが空なので、その場合の処理が無いような・・・ >どういう意味でしょうか? ファイルが存在しない場合サブルーチンでファイルを作成するような処理が書かれてありますが、その場合無条件でデータを追加書き込みしなければならないはずです。 最初の処理ではファイルは空の筈ですので 「 foreach $line (@logs)」の中身がすっぽりと未処理になるのではという意味です。
- Tacosan
- ベストアンサー率23% (3656/15482)
その変更したあとのやつだと, 読み込んだデータは全部 @DATA に入って @logs には入らないですよね? なんというか, 1.データを全部ハッシュに取り込む 2.ハッシュのデータを変更する 3.ハッシュにあるデータを全部ファイルに書き出す くらいかなぁ?
- ralf124c
- ベストアンサー率52% (232/446)
1.ファイルはSubで作るけど、最初の一回は元データが空なので、その場合の処理が無いような・・・ 2.したから7行目の変数「logs」への代入がコメントアウトになっているのはなぜでしょうか?
補足
>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); それでもうまくいかないです・・。 アドバイスお願いします。