PHPでCSVファイルを上書きする方法

このQ&Aのポイント
  • 任意の行を修正し、PHPを使用してCSVファイルを上書きする方法について質問しています。
  • プログラム内でCSVファイルの特定の行を修正して上書きする方法がわからず問題になっています。
  • 任意の行のデータを認識して上書きする方法を教えていただきたいとのことです。
回答を見る
  • ベストアンサー

任意の行を修正し、ファイルを上書きしたいのですが…

<html> <head> <title>修正・変更</title> </head> <body> <?php  $aaa = $_POST['aaa'];  $bbb = $_POST['bbb'];  $ccc = $_POST['ccc'];  $dummy = $_POST['hidden'];  $lines = array($aaa, $bbb, $ccc,$dummy);  $lines = implode(",", $lines);  $lines = mb_convert_encoding($lines, "SHIFT-JIS" , "EUC-JP");  $file = file('sample.csv');  $file[$i] = $lines."\n";  $fp = fopen("sample.csv","w+");  for($i=0 ; $i<count($file) ; $i++) {   flock($fp, LOCK_EX);   fwrite($fp, $file[$i]);  }  fclose($fp); ?> <div align="center"> 修正・変更しました!! <br><br> <input type="button" name="button" value="戻る" onClick="location.href='aaa.php'"> </div> </body> </html> 上記の様なプログラムを「CSVファイルを書き込む方法」を基に書いて みました。 しかしながら、どうしても任意の行のデータを修正して上書きする ことができません(涙 どうやったら任意の行のデータかどうかを認識して、上書きする事が できるのでしょうか?? 皆様お忙しい中かとは思いますが、ご教授して頂けませんでしょうか。 宜しくお願い致します。

  • PHP
  • 回答数3
  • ありがとう数1

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

  • ベストアンサー
  • honoka69
  • ベストアンサー率50% (6/12)
回答No.3

もう少し確認したいのですが、 ■1つの日付けに対して、データ(予定?)を持てる件数は複数ですか? それとも1件だけですか? 1件だけなら、カレンダーのリンク部分にyyyymmdd(年月日)とかの日付のデータを持たせて、 GETで渡して、sample.csvを呼び出して配列に格納して、 for文でループ、分解して、該当の日付があれば そこで送られてきた修正データに置き換えるみたいな感じじゃないですかね。 複数データが持てるなら、各データにもう一つ持たせるデータを追加して、 ID番号を振って、GETとかで、修正したいID番号を取得して、 ループさせて、if文の中で、その該当の番号が見つかったら、 それを修正するみたいな感じになると思います。 ■該当のデータを見つけるには、カレンダーでクリックした日付と 開始日が同じなら該当のデータですか?それとも開始日~終了日の間に 含まれているデータが該当のデータですか? 後者の場合複数該当してしまう為、特定ができません。その場合は各データにID番号を持たせる必要があります。

nkm-a3u-ki
質問者

お礼

honoka69様 やはりID番号を持たせないといけないみたいですね(汗 様々なサイトをググっていてそうではないかとはうす うす思ってはいたのですが…orz。 アドバイスありがとうございます☆★ もうすこし自分の力で頑張ってプログラムを書いてみようと 思います♪♪ 自分のプログラムになにが必要かわかっただけでもありがたい です★☆ ご教授本当にありがとうございました♪♪

その他の回答 (2)

  • honoka69
  • ベストアンサー率50% (6/12)
回答No.2

すいません。 下記の投稿者です。 呼び捨てにするつもりはなかったのですが、 多分nkm-a3u-kiが作ったスクリプトだと、 ↓ 多分nkm-a3u-kiさんが作ったスクリプトだと、 に訂正して読み直してください。 自分のコメントの編集のやり方知ってたら教えて下さい・・・。

  • honoka69
  • ベストアンサー率50% (6/12)
回答No.1

多分nkm-a3u-kiが作ったスクリプトだと、 CSVファイルができないと思うのでとりあえず、 CSVファイルを作る所までを書いてみました。 それで任意の行というのが分からなかったのですが、 任意の行というのは具体的にどういったケースなのでしょうか? それが分からないと、データの中から該当のデータを抽出できません。(任意=どういったルールかが分からないので) <?php //makeCsv.php $aaa = $_POST['aaa']; $bbb = $_POST['bbb']; $ccc = $_POST['ccc']; $dummy = $_POST['hidden']; $flag = false; if ( $aaa && $bbb && $ccc && $dummy ) { $tmp_lines = array($aaa, $bbb, $ccc,$dummy); $lines = implode(",", $tmp_lines); $lines = mb_convert_encoding($lines, "SHIFT-JIS" , "EUC-JP"); $file = @file('sample.csv'); $i = count ( $file ); $file[$i] = $lines."\n"; $data = implode ( "" , $file ); $fp = @fopen ( 'sample.csv' , "w" ); flock ( $fp , LOCK_EX ); fwrite ( $fp , $data ); flock ( $fp , LOCK_UN ); fclose ( $fp ); $flag = true; } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"/> <title>修正・変更</title> </head> <body> <form action="makeCsv.php" method="post"> <input type="text" name="aaa"><br> <input type="text" name="bbb"><br> <input type="text" name="ccc"><br> <input type="text" name="hidden"><br> <input type="submit" value="送信"> </form> <?php if ( $flag ) { print '<div align="center">'; print '修正・変更しました!!'; print "<br>\n<br>\n"; print '<form method="aaa.php" method="post">'; print "<input type=\"button\" name=\"button\" value=\"戻る\" onClick=\"location.href='aaa.php'\">"; print '</form>'; print '</div>'; } ?> </body> </html>

nkm-a3u-ki
質問者

補足

honoka69様 説明不足で申し訳ございませんでした。 現在、作成しているプログラムはシステムカレンダーを作っています。 CSVファイルには1列目に件名、2列目に開始日、3列目には終了日 といった具合のデータが50~100行に渡ってファイルされています。 その中から、カレンダーにリンクで予定を各々に表示させています。 クリックすることで次の画面にその内容を表示し、これを変更したい といった感じです。 新規に予定の入力&反映は出来るようになったのですが、一度入力 した予定の修正・上書き保存が出来ないといった感じです。 どうかご教授宜しくお願い致します。

関連するQ&A

  • 変数を使用したファイルのオープン

    $a=ccc として、 open(IN,"aaa/bbb/$a.csv"); っていうのは、うまく行くんですけど、 $a=aaa/bbb/ccc open(IN,"$a.csv"); っというのが、うまくいきません、なにかいい方法ありませんでしょうか、 それとも、こんな書き方はダメなのでしょか?

    • ベストアンサー
    • Perl
  • C言語による「テキストファイルの読み書き(fprintf)」について

    C言語による「テキストファイルの読み書き(fprintf)」について質問です ずぶの初心者ですが、既知のファイルの1行目に指定した文字列を付加させるプログラムを作りたいと思っています。 以下のように作りました。 ------------------------------------------------------------ #include <stdio.h> int main(void) { FILE *fp; fp = fopen("test.csv","r+"); fprintf(fp,"コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56\n"); fclose(fp); return 0; } ------------------------------------------------------------ このとき「test.csv」の内容が以下のようであったとします。(容量は1MBくらいです。) 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj この状態でプログラムをコンパイルして実行すると、「test.csv」の内容が以下のようになってしまいます。(一行目が消える) AAA,BBB,CCC,DDD,EEE 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj またcsvの行が増える度に妙な挙動になっていきます・・・(一行あいたり、先頭行が5行ほど消えたり) 希望する動作としては コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj のようになるようにしたいのですがどのようにすればよいのでしょうか。 よろしくお願いします。 (使用ソフト:Borland C++ Compiler, Cpad) 参考にしたサイトの項目:http://homepage3.nifty.com/mmgames/c_guide/17-01.html

  • phpのCSVの保存について教えてください

    下記のようにinputタグから値をphpにおくり、csvファイルに保存しようとしています。 値1に12345 値2に67890 値3にあいうえお というように値を送って保存し、csvファイルを開くと、 12345," 67890",あいうえお というように、値2として送ったものの先頭にダブルコーテーションとスペース、最後にダブルコーテーションが勝手に入ってしまいます。なぜ何でしょうか?対処法も含め教えていただければありがたいです。よろしくお願いします。 --------------------html---------------------------------- <form action="send.php" method="post"> 値1:<input type="text" name="aaa" > 値2:<input type="text" name="bbb" > 値3:<input type="text" name="ccc" > <input type="submit" value="送信する"> </form> --------------------php---------------------------------- <?php $val[0] = $_POST['aaa']; $val[1] = $_POST['bbb']; $val[2] = $_POST['ccc']; $fp = fopen("valdata.csv", "a"); fputcsv($fp, $val); fclose($fp); ?>

    • ベストアンサー
    • PHP
  • CSVファイルの上書き

    CSVファイルを$line[0] = $nowの時、上書きするということをしたいのですが、array_spliceでうまくいきません。 アドバイスお願いします。 $fp = fopen('log/order.csv', 'a+'); flock($fp,LOCK_EX); if ($fp) { require_once( "./common.php" ); $AddressData = LoadTextFile( "./log/order.csv", "SJIS", "SJIS" ); if ( $AddressData == false ) { exit; } else { for ( $i = 0; $i < sizeof( $AddressData ); $i++ ) { $line = explode( ",", $AddressData[ $i ] ); if($line[0] = $now){ array_splice($line, 1, 3, array("1","2","3")); #fputs($fp, $buf2); flock($fp,LOCK_UN); fclose($fp); } } } }

    • 締切済み
    • PHP
  • ファイル書き込み操作について

    C言語でファイル書き込みを行う以下のプログラムを改造したいと思っています。 #include <stdio.h> #include <stdlib.h> int main() { char filename[10] = "output"; char strs[][10] = { "1.aaa\n" ,"2.\n" ,"3.\n" } FILE* fp; int i; int length; fp = fopen(filename , "w"); if (fp == NULL) { printf("cannot open file\n"); exit (1); } length = sizeof(strs)/10; for( i = 0; i < length ; i++ ) { fputs( strs[i], fp ); } fclose(fp); return 0; } この場合、outputの内容は、 1.aaa 2. 3. となりますが、 2行目にはscanf等を使いプロンプトから読み込んだbbbという文字列、 3行目にはtxtファイルから読み込んだcccという文字列を書き込むというような仕様にしたいと思っています。 その結果outputは、 1.aaa 2.bbb 3.ccc となるようにしたいです。 サンプルを改良してこのような仕様を満たすプログラムができますでしょうか?回答よろしくお願いします。

  • CSVに外部テキストファイルを列として追加する方法

    こんにちは。 CSVファイル(base.csv)の先頭列に、別のテキストファイル(add.txt)の中身を新規の列として挿入したいと考えているのですが、よい方法がわかりません。。。 どうのような方法を使えば対応することができるでしょうか? どうぞよろしくお願いいたします。 ■CSVファイル(master.csv) title,developer_name,seller_name,primary_genre_name,application_url AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE ■テキストファイル(add.txt) id 000 111 222 333 ↓ ■目標としたファイル(master.csv) id,title,developer_name,seller_name,primary_genre_name,application_url 000,AAA,BBB,CCC,DDD,EEE 111,AAA,BBB,CCC,DDD,EEE 222,AAA,BBB,CCC,DDD,EEE 333,AAA,BBB,CCC,DDD,EEE

  • CSVデータの行数カウント

    PHP初心者です。 アドバイスよろしくお願いします。 CSVデータ 20060802:1,AAA,少し 20060802:2,AAA,少し 20060802:3,AAA,少し 20060802:4,BBB,大きい 20060802:5,AAA,小さい 20060802:6,AAA,小さい 20060802:7,AAA,小さい があるとき、 そのCSVデータを読み込んで データの3列目を基準としてデータがいくつあるかを数えたい。 例えば 少し・・・・3 大きい・・・・1 小さい・・・・1 というふうに数えたい。 $filename = CSVデータファイル; $fp = fopen("$filename", "r"); if($fp == false){ exit; } else { for$i = 0; $i < sizeof($fp); $i++){ $line = explode(",", $fp[$i]); // ここで // $i[2]==AAA // のとき、AAAの行数をカウントする処理をしたい。 } }

    • ベストアンサー
    • PHP
  • PHPによる行データのアップダウン

    PHPによる行データのアップダウン フォームからデータ行をGETした内容をアップダウンさせたいのですが、どうにも入れ替えができません。 プログラムコードのアドバイスをください。 *ログファイルの中(data.dat) ゴリラ チューリップ ばなな ストロベリー ペンギン <?php $data = "data.dat"; function row_up() { $lines = @file($data); $lines[$ont] = $lines[$_GET[row]]; //自分 $lines[$_GET[row]] = $lines[$_GET[row]-1]; //前の人 $fp = fopen($data,"w"); rewind($fp); for($i=0;$i<count($lines);$i++) { if($lines[$i] == $lines[$_GET[row]]){ fputs($fp,$lines[$_GET[row]]); } elseif($lines[$i] == $lines[$ont]){ fputs($fp,$lines[$ont]); } fputs($fp,$lines[$i]); } fclose($fp); } function row_down() { $lines = @file($data); $lines[$ont] = $lines[$_GET[row]]; //自分 $lines[$_GET[row]] = $lines[$_GET[row]+1]; //次の人 $fp = fopen($data,"w"); rewind($fp); for($i=0;$i<count($lines);$i++) { if($lines[$i] == $lines[$ont]){ fputs($fp,$lines[$ont]); } elseif($lines[$i] == $lines[$_GET[row]]){ fputs($fp,$lines[$_GET[row]]); } fputs($fp,$lines[$i]); } fclose($fp); } switch($_GET[mode]) { case up: row_up(); break; case down: row_down(); break; default: break; } ?>

    • ベストアンサー
    • PHP
  • CSVファイルの指定部分をエクセルに取り込みたい

    複数のCSVファイルをエクセルに、VBAを使用して取り込みます。 CSVファイルの形式は決まっているのですが、キーワード行から指定行分のみを取り込みたいです。 データ形式は、 A1 aaa bbb ccc B1 aaa bbb ccc C1 aaa bbb ccc A1 a1a b1b c1c  :  : という感じで、キーワードA1行以下から次のキーワードより上のデータをエクセルに取り込みたいです。 どうぞよろしくお願いいたします。

  • CSVファイルをAccessに取りこみたい

    以下のような2つのCSVファイルがあるとします。 【hoge1.csv】 aaa,bbb,ccc,ddd 1,2,3,4 【hoge2.csv】 aaa,bbb,ddd,eee,fff 1,2,4,5,6 Accessをあまり使用したことがないので教えていただきたいのですが、 hoge1.csv、hoge2.csvを、以下のような形で Accessの1つのテーブルにインポートする事はできるのでしょうか? ---------------------------- | aaa | bbb | ccc | ddd | eee | fff | | 1 | 2 | 3 | 4 |  |  | | 1 | 2 |  | 4 | 5 | 6 | ---------------------------- ※「aaa」「bbb」…をフィールド名としたいです vb等でプログラムを自作するしかないのでしょうか? 何か良い方法がありましたら教えてください。お願いします。