csvファイルを読み込んだ時の「ゼロ」の扱い

このQ&Aのポイント
  • csvファイルを読み込む際の「ゼロ」の扱いについて教えてください。
  • csvファイルのデータを読み込むと、[0]ではなく[""]となってしまいますが、[0]にする方法はありますか?
  • 以下のようにデータが表示されます。 array(2) { [0]=> array(3) { [""]=> string(6) "佐藤" [1]=> string(6) "田中" [2]=> string(6) "中西" } [1]=> array(3) { [""]=> string(6) "東京" [1]=> string(6) "大阪" [2]=> string(7) "京都 " } }
回答を見る
  • ベストアンサー

csvファイルを読み込んだ時の「ゼロ」の扱い

すみません、教えてください。 test.csv というファイルに、 佐藤, 東京 田中, 大阪 中西, 京都 というデータが入っていたとして、以下を使って読み込むと、 <?php $file_name = "test.csv"; $fp = fopen( $file_name, 'r' ); $data = array(); while( $ret_csv = fgetcsv( $fp, 256 ) ){ for($col = 0; $col < count( $ret_csv ); $col++ ){ $data[$col][$row] = $ret_csv[$col]; } $row++; } fclose( $fp ); var_dump($data); ?> 以下のように、 [0] ではなく [""] となってしまうのですが、これを [0] にする方法はないでしょうか。 array(2) { [0]=> array(3) { [""]=> string(6) "佐藤" [1]=> string(6) "田中" [2]=> string(6) "中西" } [1]=> array(3) { [""]=> string(6) "東京" [1]=> string(6) "大阪" [2]=> string(7) "京都 " } } よろしくお願いいたします。

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

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

  • ベストアンサー
回答No.1

う~ん。その前にソースおかしくないですか? $row ←これどっからきた? $data = array(); $col=0; while( $ret_csv = fgetcsv( $fp, 256 ) ){ for($row = 0; $row < count( $ret_csv ); $row++ ){ $data[$col][$row] = $ret_csv[$row]; } $col++; } じゃないかと。 それで、さらに言えば、そもそも代入するだけで終わりでいいので。 $data = array(); while( $data[] = fgetcsv( $fp, 256 ) ) ; var_dump($data); こんだけになるとおもわれます。 その後で、縦横を入れ替えたいなら $data[x][y] -> $data[y][x] で処理したほうがすっきりしません?

関連するQ&A

  • 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
  • CSVファイル読み込み 文字化け

    アドバイスの方頂ければと思い質問しました。 os fedoracore5/php 5.2.5/mysql 5.0.27 SJISのCSVファイルを読み,UTF-8のプログラムで処理したいのですが、 文字列中に[,]を使用しているものには[""]で囲って いて、その他文字列の日本語部分は[""]で囲まれていません。 そこで下記のような形にしたのですが、日本語が化けてしまいます。 またCSVファイルの文字化けする項目を[""]で囲むと 正常に表示されます。文字列を[""]で囲まずとも文字化けしない方法、またプログラムに問題があればアドバイスを 頂ければと思います。 <?php define("TEST_FILE", "./tes.csv"); header("Content-Type: text/plain; charset=SJIS"); $fp = fopen(TEST_FILE, "r") ; while ($row = fgetcsv($fp)) { for ($j = 0; $j < count($row); $j++) { $data = mb_convert_encoding($row[$j], "UTF-8", "SJIS"); printf($data); } } fclose($fp); ?>

    • ベストアンサー
    • PHP
  • PHP5で、utf-8形式のcsvファイルを読み込む際、常にファイル内

    PHP5で、utf-8形式のcsvファイルを読み込む際、常にファイル内容の行数+1を返すようにしたいのですが、初回(ファイルの中身がないとき)がうまくいきません。どうなおせば、よいでしょうか。 ■うまく動作しないコード setlocale(LC_ALL, 'ja_JP.UTF-8'); $fp = fopen('data.csv','r'); $data = array(); while ($row= fgetcsv($fp)) { $data[] = $row; } $no = 1; if (0 < count($data)) { $no = count($data); $no++; } var_dump($no); fclose($fp); ■現在の状態 ---------------------------------------- ▽csvファイルの内容が、下記の場合 1,名前,内容 2,名前,内容 最終的なvar_dump($no);は、3 → O.K. ---------------------------------------- ▽csvファイルの内容が、下記の場合 1,名前,内容 最終的なvar_dump($no);は、2 → O.K. ---------------------------------------- ▽csvファイルの内容が、下記(中身が何もない)の場合 最終的なvar_dump($no);は、2 → × この部分を1にしたいのですが、どうすればよいでしょうか。 ---------------------------------------- また、csvファイルの内容が空の(つもりの)状態で、 var_dump($data);すると、下記表示となってしまいます。 これは、なぜでしょうか? array(1) { [0]=> array(1) { [0]=> string(3) "?" } }

    • ベストアンサー
    • PHP
  • php初心者の質問fgetcsv

    いつもお世話になっております。 下記のプログラムを実行しますと、 999,test,90, 999,test,90, 999,test,90, のようになりますが、 行末の最後のカンマを取り除きたいです。 すみません。どの部分修正すればよいか、ご教授いただきたくどうぞよろしくお願い致します。 <?php $file_name="test.csv"; $id=999; $name="test"; $point=90; $array = compact("id","name","point"); $string = implode(",",$array); $file = fopen($file_name,"a+") or die("OPENエラー{$file_name}"); flock($file,LOCK_EX); fputs($file,mb_convert_encoding($string."\n",'Shift-JIS','UTF-8')); flock($file,LOCK_UN); fclose($file); $file = fopen($file_name,"r"); while ($row = fgetcsv($file,1000,",")){ echo "<hr>"; for ($i = 0 ; $i<count($row); $i++){ echo mb_convert_encoding($row[$i].",",'UTF-8','Shift-JIS'); } } fclose($file); ?>

    • ベストアンサー
    • PHP
  • csvデータを下から数えて10行目から最後までを表

    <?php if (have_posts()): ?> <?php if(isset($_GET['s']) && empty($_GET['s'])) { echo '検索キーワード未入力'; } else { echo '“'.$_GET['s'] .'”の検索結果:'.$wp_query->found_posts .'件'; // 検索キーワードと該当件数を表示 // chmodで書き込み権限を付与 $filename = chmod("test.csv", 0775); // PHPでcsvファイルを読み込みする $f_path = "test.csv"; var_dump($f_path); // 送信内容をShift_JISに変更 mb_convert_variables('Shift_JIS', 'UTF-8', $ShiftJIS); // 書き方はおそらくあってる $keyword_data = array(date('Y-m-d-G-i-s'), $_SERVER["REMOTE_ADDR"],$_GET['s'].PHP_EOL); // ファイルを開くか、新しいテキストファイルを作って最後に追加書き込み $fp = fopen('test.csv', 'a'); // ファイルに対する処理を行う前にファイルをロックして、作業中は他の人がそのファイルに作業を行えないようにする、排他的ロック flock($fp, LOCK_EX); // CSVファイルにフォームの送信内容を記入しています fputcsv($fp, $keyword_data); // ロック解除 flock($fp, LOCK_UN); // CSVファイルをクローズして終わり fclose($fp); } ?> <ul> <?php while(have_posts()): the_post(); ?> <li> <a href="<?php the_permalink(); ?>"><?php echo get_the_title(); ?></a> </li> <?php endwhile; ?> </ul> <?php else: ?> 検索されたキーワードにマッチする記事はありませんでした <?php endif; ?> <?php setlocale(LC_ALL, 'ja_JP.UTF-8'); $fp = fopen('test.csv', 'r'); flock($fp,LOCK_SH); $rows = array(); while ($row = fgetcsv($fp)) array_push($rows, $row); flock($fp,LOCK_UN); fclose($fp); foreach (array_slice($rows, -10) as $row) vprintf("%s %s\n", $row); var_dump($row); ?> var_dump($row);で確認したところ 2021-09-07-4-27-36 126.156.166.227 2021-09-07-4-27-52 126.156.166.227 2021-09-07-4-31-03 126.156.166.227 2021-09-07-4-50-36 126.156.166.227 2021-09-07-4-52-03 126.156.166.227 2021-09-07-4-52-15 126.156.166.227 2021-09-07-4-52-26 126.156.166.227 2021-09-07-5-01-27 126.156.166.227 2021-09-07-5-14-25 126.156.166.227 2021-09-08-4-48-06 126.133.202.39 array(3) { [0]=> string(18) "2021-09-08-4-48-06" [1]=> string(14) "126.133.202.39" [2]=> string(40) "ううううううううううううう " } と出てます 2021-09-03-13-28-52,126.255.28.185,"ううう " 2021-09-03-13-29-46,126.255.28.185,"ううう " 2021-09-03-13-29-49,126.255.28.185,"ううう " 2021-09-06-14-43-33,126.204.198.239,"ううううううううううううう " 2021-09-06-14-45-37,126.204.198.239,"ううううううううううううう " 2021-09-07-3-09-52,126.156.166.227,"ううううううううううううう " 2021-09-07-3-10-34,126.156.166.227,"ううううううううううううう " 2021-09-07-3-15-56,126.156.166.227,"ううううううううううううう " 2021-09-07-3-17-27,126.156.166.227,"ううううううううううううう " 2021-09-07-3-24-07,126.156.166.227,"ううううううううううううう " 2021-09-07-3-24-29,126.156.166.227,"ううううううううううううう " 2021-09-07-3-25-04,126.156.166.227,"ううううううううううううう " 2021-09-07-3-25-19,126.156.166.227,"ううううううううううううう " 2021-09-07-3-25-33,126.156.166.227,"ううう " 2021-09-07-3-26-02,126.156.166.227,"ううう " 2021-09-07-3-26-40,126.156.166.227,"ううう " 2021-09-07-3-27-08,126.156.166.227,"ううう " 2021-09-07-3-27-27,126.156.166.227,"ううう " csvにはこのように表示されていて、下の10件最新のものを表示したいのですが、現状はIPと日時のみ表示されます。

    • ベストアンサー
    • PHP
  • CSVを作成出来たはいいものの・・

    $file_name = "oz_test.csv"; $fp = fopen( $file_name , "w"); $contents = "\"1列目\",\"2列目\"\n"; fputs($fp, $contents); こんな感じでファイルを作成し、 あとは<A>タグでダウンロード出来るまでに至ったのですが、 CSVファイルが、サーバ上に出来たら出来たまま、ディレクトリに残りますよね? ダウンロードが終われば消し去りたいのですが、 ダウンロード時のみに作成し、終われば消える仕組みにしたい。 (メモリ上に作ったら消える?HDD上に作るから消えない?) (非公開ディレクトリにファイルを作ればダウンロードできないだろうし) 何か手はありますか?

    • ベストアンサー
    • PHP
  • CSV...

    <?php $csv = "system.csv"; $array = file($csv); $c = count($array); $item = 5; //1ページの表示件数 $page = $_GET['page']; //ページ番号 $start = $page * $item; //pageが0 $matched = 0; //条件にマッチした数 foreach( $array as $i => $row ) { $row = trim( $row ); list($id[$i],$name[$i],$sex[$i],$age[$i],$stamp[$i]) = split("\,",$array[$i]); if($sex[$i] == 1 ) { if( $matched >= $start ) { echo $name[$i]; } $matched++; if( $matched - $start >= $item ) break; } } echo "登録件数:$i件"; if( $page ) echo '<a href="search_4?page=' . ( $page - 1 ) . '">前へ</a>'; else echo '前へ'; if( $i < $c ) echo '<a href="search_4?page=' . ( $page + 1 ) . '">次へ</a>'; else echo '次へ'; ?> かなりアホな質問かもしれませんが、動くかテストしようと思い 次へのリンクを押すとsearch_4?page=1となりNot Foundと表示されます。 どうしてですか?

    • ベストアンサー
    • PHP
  • 容量の大きいCSVファイルの読み込みについて

    容量の大きいCSVファイルの読み込みについて 23メガバイトあるCSVファイルに格納し、datファイルに書き込みを行いたいのですが、実行してみるとセグメンテーション違反が表示され上手くいきません。どなたか具体的に教えてください。 環境はMacOSです。 下にファイルを格納し標準出力するまでのプログラムとCSVファイルの内容を記述します。 //********************************************************************************// #include <stdio.h> #include <string.h> #include <stdlib.h> #define D_LENGTH 10000000000000 struct Data{ double voltage; double pressure; double trigger; }; int main(int argc, char *argv[]) { FILE* fp; // ファイルポインタ用 double ret; int n, i = 0; struct Data *dt; fp = fopen("p37-e1.csv","r"); if (fp == NULL) { printf( "file open error\n" ); exit(EXIT_FAILURE); } dt = (struct Data*)malloc(sizeof(struct Data)*D_LENGTH); while( ( ret = fscanf( fp, "%[^,],%[^,],%[^,],%lf",dt[i].voltage,dt[i].pressure,dt[i].trigger) ) != EOF ){ i++; } printf("\n"); printf("Read File*******************\n"); for (n = 0; n < i; n++) printf("%lf,%lf,%lf\n",dt[n].voltage,dt[n].pressure,dt[n].trigger); free(dt); return(0); } //***************************************************************************// p37-e1.csv //***************************************************************************// 2.329595,0.001373,-4.861982 2.325628,0.001984,-4.744793 2.320745,0.001678,-4.659953 2.319829,0.002289,-4.707866 2.319219,0.002289,-4.699321 2.317082,0.002594,-4.532387 2.312505,0.001984,-4.575723 . . . . //*********************************************//

  • JAVA CSV加工について

    いつもお世話になっております。 只今、JAVAのデータ(String)をCSVに出力する プログラムを作成しております String Head = "名前,年齢" String name = "山田,田中" String age = "19,27" ---CSV出力結果として--- 1列目を "名前,年齢" 2列目を "山田,19" 3列目を "田中,27" としたいのですがどうすれば良いのでしょうか 基本的な(そのまま出力)は出来ます。 宜しくお願いします

  • PHPでCSVデーターの表示について

    PHPでCSVデーターの表示について 教えてください。PHPでCSVデーターを表示したいのですが一覧表示ではなくテキストをクリックして特定のデーターを表示させようと考えております。 CSVデーターの中身(CSV.csv) 一郎,男,20歳 二郎,男,22歳 一子,女,24歳 二子,女,26歳 --data.php-- <?php $csvFile = 'CSV.csv'; $tempCSV = file_get_contents($csvFile); $tempCSV = mb_convert_encoding($tempCSV,'utf-8','SJIS-win'); $fp = tmpfile(); fwrite($fp,$tempCSV); rewind($fp); setlocale(LC_ALL,'ja_JP.UTF-8'); while ($arr = fgetcsv($fp,1024)) { list ($name,$sex,$age) = $arr; echo '<p>',<a href="01.php">' . $name . '</a>','</p>'; } fclose($fp); function h($string) { return htmlspecialchars($string, ENT_QUOTES); } ?> 一郎をクリックしたら一郎のデーターだけを(01.php)で表示させたいのですがよく分りません。 01.phpは今のところ一覧表示されるものを置いてあります。 --01.php-- <?php $csvFile = 'CSV.csv'; $tempCSV = file_get_contents($csvFile); $tempCSV = mb_convert_encoding($tempCSV,'utf-8','SJIS-win'); $fp = tmpfile(); fwrite($fp,$tempCSV); rewind($fp); setlocale(LC_ALL,'ja_JP.UTF-8'); while ($arr = fgetcsv($fp,1024)) { list ($name,$sex,$age) = $arr; echo '<table border=1>'; echo '<tr>'; echo '<td>','名前','</td>'; echo '<td>'.$name.'</td>'; echo '</tr>'; echo '<tr>'; echo '<td>','性別','</td>'; echo '<td>'.sex.'</td>'; echo '</tr>'; echo '<tr>'; echo '<td>','年齢','</td>'; echo '<td>'.$age.'</td>'; echo '</tr>'; echo '</table>'; } fclose($fp); function h($string) { return htmlspecialchars($string, ENT_QUOTES); } ?> 本を読んだり、ググったりしてヒントになる様な物を探しているのですが中々見つかりません。 初心者で申し訳ありませんが、どなたか教えていただけないでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう