現在、作成しているプログラムですが、
変更はされますが、追加されてしまいます。
現在の処理方法はこんな感じです。
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,箕輪茂樹,沖縄県那覇市
上記のように最新のもののみ残るようにするには
どのようなコードにすればよろしいでしょうか?
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,箕輪茂樹,沖縄県那覇市
実際には、同姓同名漢字も同じというのは確率は低いながらもゼロではないので、別に一意な値となる番号でも用意してそれで実装することになります。
早速の回答ありがとうございます。
自分成りに組んでみたのですが、思うように動きません。
レコードは増えないのですが、全レコード消えたり、
編集されたあとのレコードが保存されていなかったり。
一応コードを載せておきますのでご指摘が
あればよろしくお願いします。
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);
}
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?
回答ありがとうございました。まだ改変がうまくいっていないのですが、
>foreach $m (@txt) { $m .= "\n"; } の部分
の部分がないとテキストファイルに書き込むときに
改行していないファイルができあがることが
わかりました。
なので、変数に値はわたっていることがわかり
ました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 転職 長く続けられる好条件の求人でしょうか? 3 2023/07/12 18:45
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- 関東 ※東北の人からのにわか質問で不快に来たりムカついたらすいません、悪気はありません。 東京方面に住む人 8 2022/08/03 18:17
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/08 15:45
- 政治 岸田内閣は国民を代表しているでしょうか? 11 2022/05/08 05:56
- Excel(エクセル) エクセルの参照について教えていただけますでしょうか 1 2022/12/16 11:35
- 郵便・宅配 北海道版の日刊スポーツとスポーツ報知を購入しましたが1週間以上たっても届きません。 1 2023/02/28 21:34
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 神奈川県の市区町村の一覧。ただ 3 2023/05/01 18:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
while文がうまく動かない
-
連番のファイルを何個も開きたい
-
Pythonでegrep機能をつかいたい
-
[perl] もっとシンプルに改良、...
-
文字列をカウントする方法
-
ファイル全てを .xlsm に変更し...
-
一定時間が経過したフォルダの削除
-
csvファイルの横方向への改行に...
-
while(<ハンドラ>) {} で行数を...
-
画像アップロード機能を追加し...
-
batファイルでrenameができませ...
-
VBAでCSVファイルの特定行を書...
-
MATLABのm-fileについて
-
配列のサイズを動的に拡張
-
ディレクトリのファイル作成を...
-
ANSI Cでファイル名、ディレク...
-
VB6.0でDB接続する際に切断時の...
-
Pythonの再帰関数の動作の流れ...
-
AutoCADのスクリプト
-
C++でファイルから複数行のデー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル名を複数個配列で確保...
-
Fortranで1行飛ばして読み込む方法
-
perlで指定範囲を複数ファイル...
-
Pythonでegrep機能をつかいたい
-
「パスが見つかりません」とい...
-
ifstream/ofstream について
-
テキストファイルの各行を配列...
-
Perlのワンライナーをスクリプ...
-
ifstream を利用した1行分のテ...
-
C++でのテキストファイル読み込...
-
perlプログラム 外部複数ファ...
-
system関数と引数について
-
Perl 重複カウント 上位3名
-
Pythonで非日本語のUnicode文字...
-
shellのコマンド deffの差分の...
-
perlで先頭の数値をみて昇順に...
-
Visual Basicを使って三平方の...
-
while文がうまく動かない
-
Perl Grepについて
-
Perlによるディレクトリ内の連...
おすすめ情報