- ベストアンサー
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 変な質問でもうしわけございませんが、回答できるかたお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
掲示板などの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);
その他の回答 (3)
- k-family
- ベストアンサー率34% (180/523)
ごめんなさい#2は無視してください。Perlなんですね。
- tfp
- ベストアンサー率37% (3/8)
要するに配列の任意の要素を削除したいということですね? 配列の要素を削除するには 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); --------------------------------------------------
お礼
回答ありがとうございました 配列はいろいろと使うので ためになりました。 今回は使用しませんでしたが、 なんかあったら使わせていただきます。
- k-family
- ベストアンサー率34% (180/523)
この質問の趣旨というか目的はどんなところにあるのでしょうか? 単に1回限りならメモ帳で開いて削除すればOKですが、そういうことではないんですよね。配列と書いてありますし、・・・ プログラムが知りたいのでしょうか。またそうだとして、言語は?
お礼
回答ありがとうございました 早速実行してみたところ 何とかできました。 今後も(!?)よろしくおねがいします