CSVデータ修正時のファイルへの書き込み不具合?
こんにちは。
初心者ながら、PerlでCSVファイルを使って簡易的なDBを作っています
その際、下記の方法でCSVファイルの修正していますが、うまくいきません><
申し訳ありませんが、お知恵をお借りできますでしょうか?
困っております(泣)
◆下記プログラム内容
CSVを読み込み、一致する部分があればそこを修正し、新たなCSVとして書き出す
◆マスターDB(カンマ区切りのCSVファイルにて作成)
・DBは横230×縦max2000程度(現行は横200×縦100程度)
・先頭、横20までは日本語で、最大でも全角50文字程度(改行、カンマは事前に除外(置き換え)しています)
・その後は「1 or 空白」。(フラグが立っているか、いないかだけ)
◆発生する不具合?
(1)修正箇所の後ろの2~3行が、修正行の後ろにそのまま追加される(欠落する場合もあり)
(2)DBの一番最後の最後の行に不明なデータが追加される
例1:,,,,,1,,,,,,,,1,,,,,,,,1,,,,,,,,1,,,,,,,,1
例2:,,,,
例3:改行のみ
(3)上記、(1),(2)は基本的に同時発生
(4)上記、(1),(2)が毎回ではなく時々発生(と言うか、かなり頻繁に… 10回に8回程…)
***************************************
# @master:CSVデータを読み込んだDB
# @data:修正内容の入っている配列
# @write_db:修正後の@master(これが新しいCSVとして書き込まれる)
#読み込み、及び修正
open (write_db,"+<db.csv");
flock write_db,2;
$i=0;
while(<write_db>){
@master = split(/,/, $_);
if( $master[0] == $data[0] )
{
$master[1] = $FORM{'textfield62'};
$master[2] = $FORM{'textfield6'};
$master[9] = $data[3];
$master[10] = $data[4];
$master[11] = $data[5];
$master[12] = $data[6];
$master[13] = $data[7];
$master[14] = $FORM{'textfield7'};
$master[15] = $FORM{'textfield5'};
#修正前の”1”のフラグ情報をクリア
for( $m = 21 ; $m <= $#master ; $m++ ){
$master[$m]="";
}
#修正情報の入っている@dataに基づいて@masterを変更(新しいフラグを立てる)
for( $k = 8 ; $k < $end_num ; $k++ ){
$master[$data[$k]] = 1;
}
}
$write_data[$i] = join(',',@master);
$i++;
}
seek write_db,0,0;
close (write_db);
#書き出し操作
open (OUT,"+<db.csv");
flock OUT,2;
foreach my $ii ( @write_data ){
print OUT $write_data[$ii];
}
seek OUT,0,0;
close (OUT);
お礼
ありがとうございます。非常に助かりました。 初心者にはシンプルでわかりやすい記述で、 なんにでも応用が利きそうです。 また、よろしくお願いいたします。