こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

csv形式のデータの一部を削除して、上書きする方法

前回も似たような(?)質問をしたんですが
今回も質問させてください。CSVに関して(CSVだけというわけではありませんが)

以下のようなデータを読み込んで、配列変数に格納後...

aaa,bbb,ccc,ddd
eee,fff,ggg,hhh
iii,jjj,kkk,lll
mmm,nnn,ooo,ppp
qqq,rrr,sss,ttt

↑のデータを、下のようなデータにして、保存しなおすにはどうすればよいでしょうか。(上から二列目を削除して前のデータに保存しなおす)

aaa,bbb,ccc,ddd
iii,jjj,kkk,lll
mmm,nnn,ooo,ppp
qqq,rrr,sss,ttt

変な質問でもうしわけございませんが、回答できるかたお願いします。

投稿日時 - 2002-05-12 16:44:44

QNo.269041

暇なときに回答ください

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

掲示板などのCGIで、記事削除機能が同じようなことをやっています。
1行づつ読み出して、テンポラリ変数に入れて行きます。
その時、削除対象のデータだけ入れずにおけば、対象行を削除したテンポラリ変数ができますので、それをファイルに書き込みます。
わかりますか?↓こんな感じです。

foreach $line (@DATA) {
 ($idno,$field1,$field2,$field3) = split(/\,/,$line);
 chop($field3);
 if ($target ne $idno){
  $tempvalue = "$idno,$field1,$field2,$field3\n";
  $temp[$i] = $tempvalue;
 }
 $i++;
}

open (FILE, ">$datafile") or die "Error";
print FILE @temp;
close (FILE);

投稿日時 - 2002-05-12 17:33:13

お礼

回答ありがとうございました
早速実行してみたところ
何とかできました。

今後も(!?)よろしくおねがいします

投稿日時 - 2002-05-17 01:35:44

ANo.1

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

ごめんなさい#2は無視してください。Perlなんですね。

投稿日時 - 2002-05-12 21:43:07

ANo.3

tfp

要するに配列の任意の要素を削除したいということですね?
配列の要素を削除するには splice 関数を使います。
詳しくはマニュアル等を見てください。

以下、簡単な例です。

@array = qw(
aaa,bbb,ccc,ddd
eee,fff,ggg,hhh
iii,jjj,kkk,lll
mmm,nnn,ooo,ppp
qqq,rrr,sss,ttt
);

splice @array, 1, 1; # 配列要素2番目$array[1]を削除

ファイルの更新まで含めるとこんな感じでしょうか。
--------------------------------------------------
open(FILE, "+< file.txt") or die $!;
@lines = <FILE>;
splice(@lines, 1, 1);
truncate(FILE, 0, 0);
seek(FILE, 0, 0);
print FILE @lines;
close(FILE);
--------------------------------------------------

投稿日時 - 2002-05-12 21:34:39

お礼

回答ありがとうございました
配列はいろいろと使うので
ためになりました。

今回は使用しませんでしたが、
なんかあったら使わせていただきます。

投稿日時 - 2002-05-17 01:37:11

ANo.2

この質問の趣旨というか目的はどんなところにあるのでしょうか?

単に1回限りならメモ帳で開いて削除すればOKですが、そういうことではないんですよね。配列と書いてありますし、・・・
プログラムが知りたいのでしょうか。またそうだとして、言語は?

投稿日時 - 2002-05-12 18:56:46

あなたにオススメの質問