• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:phpでcsvの処理で困ってます。)

phpでcsvの処理で困ってます

このQ&Aのポイント
  • phpでcsvの処理で困っています。指定した行の5番目の値を1つ増やしてcsvデータに上書きしたいです。
  • phpでcsvの処理で問題が発生しています。特定の行の5番目の値を増やしてcsvデータに反映させる方法を教えてください。
  • csvデータを2次元配列として読み込み、指定した行の5番目の値を増やしたいです。phpのcsv処理に詳しい方、助けてください。

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

  • ベストアンサー
  • mk48a
  • ベストアンサー率56% (1133/2007)
回答No.4

>abc.csvファイルが空になって、上書きされてません。 配列の使い方が間違っているかも。 ああ、fputcsv()も1行単位なのか。 サンプルから2次元配列で一気に書き込めるものだと思ってた。 あと、同じabc.csvファイルを書き換えるのであれば、読み書きを分けないといけないですね。 で、最初のfopenは読み込みなので、オプションは"r"にします。 <?php header("Content-Type: text/html; charset=UTF-8"); $linenum = $_POST['num']; $list = fopen("abc.csv", "r"); $i = 0; //行指定が0始まりの場合1始まりの場合は $i = 1;にする $csv = array(); //CSVファイルを1行ずつ全部読み込み while ($line= fgetcsv($list, 1000,",")) { //指定行であれば値を変更する if($i == $linenum) { $line[4] += 1; } //読み込んだ行を配列に保存 array_push($csv,$line); $i++ } fclose($list); //CSVファイルを保存 $list = fopen("abc.csv", "w"); foreach ($csv as $line) { fputcsv($list, $line); } fclose($list); ?> こんなもんでどうでしょう? 詳しい人なら一発でしょうが、普段はC++、C#しか使わないので・・・。 2次元配列の使い方間違ってたらすみません。

dkong
質問者

お礼

ありがとうございました。思った通りにできました。何度も何度も回答していただき助かりました。とても勉強になりました。また、よろしくお願いします。

その他の回答 (3)

  • mk48a
  • ベストアンサー率56% (1133/2007)
回答No.3

>Warning:fputcsv()expects parameter 2 to be array, null given in ..... という警告がでて、fputcsv($list, $array);の部分にエラーが出ます。 すみません、寝ぼけてたようです。修正し忘れです・・・。 誤:$array[$linenum][4] += 1; 正:$csv[$linenum][4] += 1; 誤:fputcsv($list, $array); 正:fputcsv($list, $csv); <?php header("Content-Type: text/html; charset=UTF-8"); $linenum = $_POST['num']; $list = fopen("abc.csv", "w"); $i = 0; //行指定が0始まりの場合1始まりの場合は $i = 1;にする $csv = array(); //CSVファイルを1行ずつ全部読み込み while ($line= fgetcsv($list, 1000,",")) { //読み込んだ行を配列に保存 array_push($csv,$line); //指定行であれば値を変更する  if($i == $linenum) { $csv[$linenum][4] += 1; } $i++ } //CSVファイルを保存 fputcsv($list, $csv); fclose($list); ?> arrayという変数名はPHPにarray() があるので、混同を避けるため変更させてもらいました。 これで動いてくれると良いのですが。。

dkong
質問者

お礼

何度もありがとうございます。エラーは出なくなりました。しかし、abc.csvファイルが空になって、上書きされてません。ファイルが空に」なってます。 fopen("abc.csv", "w");の部分のwをw+,r,r+,やa,a+などいろいろ変えてみたのですが、うまくいきませんでした。

  • mk48a
  • ベストアンサー率56% (1133/2007)
回答No.2

すいません、見直したら無用なコードと間違いがありました。 fgetcsv()は1行ずつの読み込みなのですね。 header("Content-Type: text/html; charset=UTF-8"); $linenum = $_POST['num']; $list = fopen("abc.csv", "w"); $i = 0; //行指定が0始まりの場合1始まりの場合は $i = 1;にする $csv = array(); //CSVファイルを1行ずつ全部読み込み while ($line= fgetcsv($list, 1000,",")) { //読み込んだ行を配列に保存 array_push($csv,$line); //指定行であれば値を変更する  if($i == $linenum) { $array[$linenum][4] += 1; } $i++ } //CSVファイルを保存 fputcsv($list, $array); fclose($list); ?> こんなもんかと思います。 変数名はちょっと変更しました。 一応調べて書きましたが、一部文法間違っているかもしれません。 なので、間違いがある場合はコードの意図をくみ取って修正してください。 あとは実際に動かしてみて動作を確認してみてください。 行指定の番号は0始まりにしておきましたが、一般的な感覚では1始まりになっているかもしれないので、呼び出し元と調整してください。 コードで不明な部分がある場合は補足でお願いします。

dkong
質問者

お礼

何度もありがとうございます。教えていただいたのを試してみたのですが、うまくいきません。コードで不明な部分はないのですが補足させていただきます。よろしくお願いします。

dkong
質問者

補足

Warning:fputcsv()expects parameter 2 to be array, null given in ..... という警告がでて、fputcsv($list, $array);の部分にエラーが出ます。

  • mk48a
  • ベストアンサー率56% (1133/2007)
回答No.1

$newarrayいらなくないですかね? $arrayは2次元配列なので、 >$newarray[$h][$i] = $array[$i]; この代入は変です。 $arrayで読み込んだものを編集して fputcsv($list, $array); で良いようなきがしますが。 PHPは初心者なので、若干の違いはあるかもしれませんが、 <?php header("Content-Type: text/html; charset=UTF-8"); $linenum = $_POST['num']; $list = fopen("abc.csv", "w"); $h = 0; while ($array = fgetcsv($list, 1000,",")) {   for ($i = 0; $i < count($array); $i++){   $array[$linenum][4] += 1; fputcsv($list, $array); fclose($list); ?> では?

dkong
質問者

お礼

ありがとうございます。arrayにについての調べてみます。他は大丈夫でしょうか?