• ベストアンサー

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 変な質問でもうしわけございませんが、回答できるかたお願いします。

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

  • ベストアンサー
  • Spur
  • ベストアンサー率25% (453/1783)
回答No.1

掲示板などの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);

noname#32059
質問者

お礼

回答ありがとうございました 早速実行してみたところ 何とかできました。 今後も(!?)よろしくおねがいします

その他の回答 (3)

  • k-family
  • ベストアンサー率34% (180/523)
回答No.4

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

  • tfp
  • ベストアンサー率37% (3/8)
回答No.3

要するに配列の任意の要素を削除したいということですね? 配列の要素を削除するには 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); --------------------------------------------------

noname#32059
質問者

お礼

回答ありがとうございました 配列はいろいろと使うので ためになりました。 今回は使用しませんでしたが、 なんかあったら使わせていただきます。

  • k-family
  • ベストアンサー率34% (180/523)
回答No.2

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