• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:特定のデータを更新する)

特定のデータを更新する方法

このQ&Aのポイント
  • 特定のデータを更新する方法についてまとめました。データの追加を防ぐための処理方法や、最新のデータのみ表示・保存する方法について説明します。
  • プログラムにおけるデータの更新方法について解説します。データの変更を行いつつ、追加を避ける処理方法や、最新のデータのみ残す方法をご紹介します。
  • データを更新する方法について説明します。データの変更時に行が増えないようにする方法や、最新のデータのみ残す処理方法についてまとめました。

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

  • ベストアンサー
  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.2

> foreach $m (@txt) { $m .= "\n"; } ここでは意味の無い記述だと思われ > $new_n = (split(/,/,$m))[0]; > if((split(/,/,$m))[0] ne $new_n){ [0]に相当するのは、ここでは1992や1994といった数値の部分になると思いますが(初めのテキストファイルの中身のままだとすれば)それだと ne ではなく != とします。 文字列なら ne で数値なら != です。 $mに新しいデータはちゃんと入っていないと思われ。 (localで局所化しているのにどこでも代入されていない。また、前述の foreach $m (@txt) { $m .= "\n"; } の部分で上書きされる) > print TXT $txt; foreach で配列@TXTを廻すときに変数を$mとしているのになぜに$txt?

aoitorigairu
質問者

お礼

回答ありがとうございました。まだ改変がうまくいっていないのですが、 >foreach $m (@txt) { $m .= "\n"; } の部分 の部分がないとテキストファイルに書き込むときに 改行していないファイルができあがることが わかりました。 なので、変数に値はわたっていることがわかり ました。

その他の回答 (1)

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.1

名前の部分において、同姓同名(字が同じ)の人物がいないとすれば、それをキーにして以下のようにできます。 初めのファイルdetaの中身が↓とする 1992,岩田実,東京都港区 1994,青山徹,神奈川県横浜市 1998,箕輪茂樹,沖縄県那覇市 例えば↓が新しい(変更後)のデータとする $new = '1992,岩田実,埼玉県青葉郡'; open(FH, "+< data"); flock(FH,2); @list = <FH>; truncate(FH,0); seek(FH,0,0); $new_n = (split(/,/,$new))[1]; foreach $data (@list){ if((split(/,/,$data))[1] ne $new_n){ print FH $data; }else{ print FH "$new\n"; } } close(FH); 変更後のファイルdataの中身は↓になる 1992,岩田実,埼玉県青葉郡 1994,青山徹,神奈川県横浜市 1998,箕輪茂樹,沖縄県那覇市 実際には、同姓同名漢字も同じというのは確率は低いながらもゼロではないので、別に一意な値となる番号でも用意してそれで実装することになります。

aoitorigairu
質問者

お礼

早速の回答ありがとうございます。 自分成りに組んでみたのですが、思うように動きません。 レコードは増えないのですが、全レコード消えたり、 編集されたあとのレコードが保存されていなかったり。 一応コードを載せておきますのでご指摘が あればよろしくお願いします。 sub write_txt1 { local($m); local($new_n); foreach $m (@txt) { $m .= "\n"; } &lock_open(TXT, "+<$txtfile1"); @txt = <TXT>; truncate(TXT,0); seek(TXT,0,0); $new_n = (split(/,/,$m))[0]; foreach $m (@TXT){ if((split(/,/,$m))[0] ne $new_n){ print TXT $txt; }else{ print TXT "$m\n"; } } print TXT @txt; #→全消去のため付加 &unlock_close(TXT); }

関連するQ&A