プロが教えるわが家の防犯対策術!

現在、作成しているプログラムですが、
変更はされますが、追加されてしまいます。

現在の処理方法はこんな感じです。

sub write_txt1 {
local($m);
foreach $m (@txt) { $m .= "\n"; }
&lock_open(TXT, ">$txtfile1");
print TXT @txt;
&unlock_close(TXT);
}

テキストファイルの結果は、

1992,岩田実,東京都港区
1992,岩田実,埼玉県青葉郡
1994,青山徹,神奈川県横浜市
1994,青山徹,北海道函館市
1998,箕輪茂樹,沖縄県那覇市

読みこみ(表示)で最新のもののみ表示されるように
していますが、テキストファイルがどんどん大きくなって
しまいます。


上記のように
だれかを変更すると変更するたびに行(レコード)が
増えてしまいます。

理想としては、古いデータを消し、新しいデータのみ
テキストファイルに記述されるようにしたいです。
こんな感じに・・・。
1992,岩田実,東京都港区
1994,青山徹,神奈川県横浜市
1998,箕輪茂樹,沖縄県那覇市

上記のように最新のもののみ残るようにするには
どのようなコードにすればよろしいでしょうか?

A 回答 (2件)

名前の部分において、同姓同名(字が同じ)の人物がいないとすれば、それをキーにして以下のようにできます。




初めのファイル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,箕輪茂樹,沖縄県那覇市


実際には、同姓同名漢字も同じというのは確率は低いながらもゼロではないので、別に一意な値となる番号でも用意してそれで実装することになります。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
自分成りに組んでみたのですが、思うように動きません。
レコードは増えないのですが、全レコード消えたり、
編集されたあとのレコードが保存されていなかったり。
一応コードを載せておきますのでご指摘が
あればよろしくお願いします。

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);
}

お礼日時:2006/01/03 01:13

> 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?
    • good
    • 0
この回答へのお礼

回答ありがとうございました。まだ改変がうまくいっていないのですが、

>foreach $m (@txt) { $m .= "\n"; } の部分

の部分がないとテキストファイルに書き込むときに
改行していないファイルができあがることが
わかりました。
なので、変数に値はわたっていることがわかり
ました。

お礼日時:2006/01/06 22:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!