行指定削除 - PHPプロ!Q&A掲示板

254

  • 0P

行指定削除

質問日時 / 2006年11月29日 14:26    回答数 / 7件

Questioner:  kikutyan  このエントリーをはてなブックマークに追加 

キーワード / CSV    削除    行指定   

  1. $fp = fopen("donut.csv", "r");
  2. while ($data = fgetcsv($fp, 10000)) {
  3. $gyou = count($data);
  4. print "<tr>";
  5. $m ++; 
  6. print "<td align="center\" height=\"30\" width=\"50\"><input type=\"radio\" name=\"chek\" value=\"$m\"></td>";
  7. print "<td align=\"center\" height=\"30\" width=\"50\">$m</td>";
  8. print "<td align=\"center\" width=\"150\">$data[0]</td>";
  9. print "<td align=\"center\" width=\"100\">$data[1]</td>";


上記の様に、ラジオボタンで行選択し、指定したCSVデータの行を削除出来る様にしたいのですが・・・
PHPで、CSVファイルの行指定削除は出来ますでしょうか?

宜しくお願いします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01sunsun行数をカウントすることと、指定行に達したら表示しな
┣A02kikutyanご返事ありがとうございます。 ただ、新たに削除行が
┃┗A02-1sunsun新たな削除行とはどういう状況のことでしょうか?具体
┣A03kikutyan言葉足らずで申し訳ありませんでした。 現在、CSV
┃┣A03-1wintermuteえーと。単に興味で聞いてみたいのですが(答えでなく
┃┗A03-2sunsunfopen、fgets、fputsなどで扱える操作は読み込み・書
┗A04eduteえーと、CSVファイルの行数がそんなに多くなければ、

回答一覧

並び替え:

A01
answerersunsun [11月29日 17:11] (最終編集:11月29日 17:30)

行数をカウントすることと、指定行に達したら表示しないようにすればいいと思います。
具体的には、

  1. <?php
  2. $fp = fopen("ファイル名","r");
  3. $count = 1;
  4. $remove_row_list = array(1310)// 削除行リスト
  5. while ($data=fgetcsv($fp10000)) {
  6.   if (!in_array($count$remove_row_list)) {
  7.     // 表示処理
  8.   }
  9.   $count++;
  10. }
  11. ?>

となります。
$remove_row_listを配列にするか、ただの数値にして1行だけの削除にするかは、目的次第ですが。

この意見に回答する

ツリーへ TOPへ

A02
answererkikutyan [11月29日 17:57]

ご返事ありがとうございます。
ただ、新たに削除行がでた場合は対応できないと思いますが・・・

この意見に回答する

ツリーへ TOPへ

A02-1
replyersunsun [11月29日 19:10]

新たな削除行とはどういう状況のことでしょうか?具体的に話して頂かなければ答えようがありません。$remove_row_listを固定する必要はなく、必要に応じて変えればいいのでは?

この意見に回答する

ツリーへ TOPへ

A03
answererkikutyan [11月30日 09:41]

言葉足らずで申し訳ありませんでした。
現在、CSVファイルに、注文内容の登録ができ、他のPHPを用いて一覧が表示されるようにしています。

例えば、顧客が注文をキャンセルした場合、CSVファイルに登録されている、
顧客名または、行指定の抽出により、削除できる様にしたいのです。

本来であれば、SQLなどを利用して運用したいのですが、そこまで大きなシステムではないので、
CSVファイルなどで、出来ないものかと検討していた次第です。

PHPを現在勉強しており、言葉足らずで申し訳ございませんが、宜しくお願いします。

この意見に回答する

ツリーへ TOPへ

A03-1
replyerwintermute [11月30日 10:36]

えーと。単に興味で聞いてみたいのですが(答えでなくてすみません)

excelなどの表計算ソフトを使うようにした方が早くないですか?

この意見に回答する

ツリーへ TOPへ

A03-2
replyersunsun [11月30日 15:19]

fopenfgetsfputsなどで扱える操作は読み込み・書き込みなどですので、特定のファイル内からある行だけ削除するという方法はわかりません。ですが、キャンセルした顧客のIDとCSVファイル内で一致する行を除いて新しいファイルを作成することならできます。

簡単にコードを書いておきますので何らかの参考になれば幸いです。以下のコードでは行の先頭に顧客IDが入っているものと考えて記述します。

  1. <?php
  2. // ファイルパスを設定する
  3. $file_dir = "/var/www/resources";
  4. $old_file_path = $file_dir . "/old_file.csv";
  5. $new_file_path = $file_dir . "/new_file.csv";
  6.  
  7. // 削除する顧客IDリスト:必要に応じて変えて下さい
  8. $remove_id_list = array(1310);
  9.  
  10. $fp_old = fopen($old_file_path"r");
  11. $fp_new = fopen($new_file_path"w");
  12.  
  13. // データを読み込み、削除リストにない行を保存する
  14. while ($data=fgetcsv($fp_old10000)) {
  15.   if (!in_array($data[0]$remove_id_list)) {
  16.     // 配列をCSV用フォーマットに戻します
  17.     foreach ($data as $key => $val) {
  18.       $data[$key] = '"' . str_replace('"''""'$val) . '"';
  19.     }
  20.     $row = implode(","$data) . "\r\n";
  21.   
  22.     fputs($fp_new$row);
  23.   }
  24. }
  25.  
  26. fclose($fp_old);
  27. fclose($fp_new);
  28.  
  29. // 古いファイルを削除して、新しいファイル名を変更する
  30. unlink($old_file_path);
  31. rename($new_file_path$old_file_path);
  32. ?>

もちろん、8行目の削除リストは削除した顧客IDを必要に応じて入れ替えて下さい。

この意見に回答する

ツリーへ TOPへ

A04
answereredute [11月30日 16:57]

えーと、CSVファイルの行数がそんなに多くなければ、一度配列に情報全部読み込んで、消したい行数のところをunsetしてみたらどうでしょう。
  1. $csv_file = file("CSVへのパス");
で配列に取得して、5行目を消したければ
  1. unset($csv_file[4]); //1行目なら0、2行目なら1、3行目なら2……という数字が送られてくると仮定時
其の後、残りの$csv_fileでCSVファイルを作り直すとか。
  1. $fp = fopen("新しいCSVへのパス", "w");
  2. foreach ($csv_file as $line) {
  3.   fwrite($fp, $line);
  4. }
一応wモードでオリジナルファイルをそのまま利用するのは危ないので、別のCSVファイルを一旦作成という事にしまして。
成功したら、オリジナルを削除し、削除後のCSVファイルをリネームして元通り……とかはダメでしょうか。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
セッションがいいのか、それともデータベースがいいのか教えて下さい。
 このエントリーをはてなブックマークに追加 
A
>ボタンをクリックしたら選んだ商品情報を持っておきたいと思っています。 そのくらいのことならセッションもしくはCookie(期限短め:場合によってはブラウザ閉じるまで)でいいんじゃないですかね。 #わ...

>>続きを読む

一つの目安として、ECサイトの購入情報など絶対に消えてはいけないものはDBに、カートなどの一時的に使用する情報や、ユーザに任意のタイミングで消去されても構わないものはセッションにと使い分けるといいでしょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)