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

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

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

abc.csvというcsvデータを2次元配列にして、その中から指定した行(送信されてきた値$linenum = $_POST['num'];)の5番目の値を1つ増やして、またcsvデータに上書きしたいと思い下記のようにしてみたのですが、うまくいきません。どのようにすればいいのでしょうか、具体的に教えていただければ、ありがたいです。よろしくお願いします。 <?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++){   $newarray[$h][$i] = $array[$i]; } $h++;  } $cu = $newarray[$linenum][4]; $cu = $cu + 1; $newarray[$linenum][4] = $cu; fputcsv($list, $newarray); fclose($list); ?>

  • dkong
  • お礼率86% (170/197)
  • PHP
  • 回答数4
  • ありがとう数13

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

  • ベストアンサー
  • 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にについての調べてみます。他は大丈夫でしょうか?

関連するQ&A

  • array をつかってcsv ファイルを作る

    もとになるcsvファイルから、いらない行を削除して新しいcsvファイルを作りたいです。 そこで、このようにしてみました。 $fptemp = fopen('data-temp.csv', "a+"); if (($handle = fopen('data.csv', "r")) !== FALSE) { while (($data= fgetcsv($handle)) !== FALSE) { if(条件){ $list = array($data); fputcsv($fptemp, $list); } } } fclose($handle); fclose($fptemp); ところが、結果の行にはすべてArray とだけ出力されます。 もとの行をそのまま出すにはどうしたら良いでしょうか?

    • ベストアンサー
    • PHP
  • CSVファイルを更新する処理

    CSVに追加や削除、一覧表示、更新をする処理を書いたのですが 更新処理だけうまくいかずに躓いています。 readメソッドのreturn $files;のところで下記の syntax error, unexpected '$files' (T_VARIABLE)というエラーが出てしまいます。 なぜエラーが出ているか教えていただけるとありがたいです。 <?PHP function con($hantei, $num, $name, $age, $address){ $data = [ $num, $name, $age, $address ]; $datas = [$data]; // 追加 if($hantei === 'add'){ $fp = fopen('data.csv', 'a'); foreach($datas as $data) { $line = implode(',' , $data); fwrite($fp, $line . "\n"); } fclose($fp); //更新 } elseif ($hantei === 'update') { function read() { $FILENAME = 'data.csv'; $file = fopen($FILENAME, 'r'); while($data = fgetcsv($file)) { $files[] = $data; }   fclose($file);   return $files; } function replace($num, $name, $age, $address) { // read() $files = read(); $arr = array(); foreach($files as $key => $el) { // [0][a, b, c, d] // [1][a, b, c, d] if ($el[0] == $num) { // $arr[0][0] = $num ... $arr[$key] = array($num, $name, $age, $address); } else { $arr[$key] = array($el[0], $el[1], $el[2], $el[3]); } }    return $arr; } replace(); function write($arr){   $FILENAME = 'data.csv'; $file = fopen($FILENAME, 'w');   foreach ($arr as $v) {    fputcsv($file,$v); }    fclose($file); } $arr = replace($num, $name, $age, $address); write($arr); //削除 } elseif ($hantei === 'dalete') { $file = file('data.csv'); unset($file[$num]); file_put_contents('data.csv', $file); //一覧表示 } elseif ($hantei === 'list') { $fp = fopen('data.csv', 'r'); $readed = fread($fp, filesize('data.csv')); print_r($readed); fclose($fp); } } con('update', 1, 'name', 3, 'address');

    • 締切済み
    • PHP
  • PHPのデータをCSVファイルに保存

    PHPで入力された情報を、CSVファイルに保存したいのですがうまくいきません。 $list=array($name,$jyusyo,$mail,$tel,$text); $fp=fopen('dat/dat.csv','a+'); foreach($list as $line){ fputcsv($fp,split(',',$line)); } fclose($fp); ウェブで調べてこのような形のものを作成してはみたんですが、 エラーが出てしまいます。CSVファイルに保存したい時は、 CSVファイルを先に作るべきなのでしょうか?そうでしたら、 作成の仕方を教えていただきたいです。 初心者ですがよろしくお願いします。

    • 締切済み
    • PHP
  • 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
  • ?をつけて送信してもだめでしょうか

    ちゃんと表示されるのは これを実行したときで <?php $handle = fopen("jikken.csv", "r"); while (($data = fgetcsv($handle,1000, ",")) !== FALSE) { $num = count($data); if($data[0] == 9999999){ echo $data[1]."<br>\n"; } } fclose($handle); ?> しかし <?php $codex = $_POST['code']; $handle = fopen("jikken.csv", "r"); while (($data = fgetcsv($handle,1000, ",")) !== FALSE) { $num = count($data); if($data[0] == $codex){ echo $data[1]."<br>\n"; } } fclose($handle); ?> このように入れて ~~.php?code=9999999 としても うまくいかないのです 何がおかしいのでしょうか

    • 締切済み
    • PHP
  • PHPでCSVをへんしゅうするには?

    CSVで編集をする際の動作にどうしても詰まってしまい困っています。 いろんなことを試したのですがうまくいきません。 追加と削除ができなので、それを合体すれば出来るのかなって思ったのですが、 ファイルの中身が消えてしまって、先に進まない状態なのです。 // 変更 if(isset($_POST["submit_upd"])){ // 押下したボタン番号を取得 $upd = isset($_POST["sbumit_upd_del"])? $_POST["sbumit_upd_del"]: ""; // POSTされたデータを取得 $number = $_POST["number"]; $category = htmlspecialchars($_POST["category"], ENT_QUOTES); $dating = htmlspecialchars($_POST["dating"], ENT_QUOTES); //csvファイルに書き込み $data_all = @file($filecsv); $file_csv = @fopen($filecsv, "w"); flock($file_csv,2); for($i=0; $i<count($data_all);$i++){ $data_array = explode(",", $data_all[$i]); if($data_array[0] != $upd){ //csvファイルに書き込み $current = @file_get_contents($filecsv); $current .= "$number,$category,$dating\n"; file_put_contents($filecsv, $current); } } flock($file_csv,3); fclose($file_csv); unset ($data_all); header("Location: index.php"); exit; }

    • ベストアンサー
    • PHP
  • phpでcsvの文字化けを直す方法が知りたい!

    <?php /* 配列の作成 */ $array = array($name, $telephone, $email); /* ファイルポインタをオープン */ $file = fopen("information.csv", "a"); /* CSVファイルを配列へ */ if( $file ){ var_dump( fputcsv($file, $array) ); } /* ファイルポインタをクローズ */ fclose($file); ?> 上記のように記載した時、windowsのchromeでみると文字化けしてしまいます。 どのような記述をすれば、文字化けしないか教えてください。

    • ベストアンサー
    • PHP
  • csvに中身が書き込まれない

    作成してみたものがうまく動かず、どこがおかしいのかよく分からないため、 質問させていただきます。 もともとtest.csvにはUTF-8で作成した中身があります。 ひとつ前の画面でPOST送信しているフォームがあり、 中身のデータは下記です。 <form action="kakikomi.php" method="post"> <input type="hidden" name="aaa" value="bbb,ccc,ddd"> </form> #kakikomi.php(UTF-8) $csvFileName="test.csv";$csv=array(); foreach($_POST as $val){$csv[]=explode(",",$val);} setlocale(LC_ALL,"ja_JP.UTF-8"); if( $pointer=fopen($csvFileName,"w")): foreach($csv as $line){fputcsv($pointer,$line);} fclose($pointer); //print_r($csv); else:die('メッセージ'); endif; この結果はcsvの中身は真っ白になってしまいます。 fputcsvのマニュアル例からそのまま引用したのですがどこかおかしいのでしょうか。

    • 締切済み
    • PHP
  • CSVファイルの改行

    似たような質問はあったのですが、解決できませんでした。 複数のテーブル(mysql)から抽出したデータをCSVファイルにして ダウンロードという動きを作りましたが、Excelでは改行されているのに メモ帳だと改行されません。 配列の最後に"\r\n"を挿入してみたところ、メモ帳での改行はできたのですが、 Excelに必要ない改行が入ってしまいます。(あたりまえですよね) 改行コードの入れるタイミングと方法を教えて頂けますか。 select文 while($rows = @mysql_fetch_array($result)){ $list[$i] = array ($aaa,$bbb,$ccc); $i++; } $filename = 'ファイル名'; $fp = fopen($filename.'.csv', 'w'); foreach ($list as $line) { fputcsv( $fp , $line ); } fclose($fp); ZIP圧縮処理後ダウンロード 環境:php5,mysql5

    • 締切済み
    • PHP
  • CSVの操作方法について

    CSVの操作方法について 以下のようなソースでcsvからデータを配列に格納しています。 わからない事が2点あるのですがどのようにすれば可能でしょうか? ※csvの例 No,name,age 1,あああ,25 2,いいい,28 3,ううう,33 1:csvのカラム名を「No」とした場合ここに数字を入れます。IDみたいなもんです。 この数字の番号だけの情報を取得するにはどうすればいいでしょうか? 2:上記同様に「No」の1~5までといったような指定した番号の情報だけを取得するには どうすればいいでしょうか? // 読み込み開始行 $start = 1; // 初期化 $row = array(); // 読込み行数 $h = 0; $filename = APP_DIR . '/csv/' . $filename; $handle = fopen($filename, 'r'); while (($data = self::fgetcsv_reg($handle)) !== false) { $_enc_to = mb_internal_encoding(); $_enc_from = 'sjis'; mb_convert_variables($_enc_to, $_enc_from, $data); if ($h >= $start) { for ($i = 0; $i < count($data); $i++) { $row[$h - 1][$i] = $data[$i]; } } $h++; } fclose($handle);

    • ベストアンサー
    • PHP

専門家に質問してみよう