• 締切済み

CSVファイルの最終行のデータを取り出したい

PHPでCSVファイルのデータを取り込もうとしています。 全てのデータを表示させるのであれば、「while」などを使って書くのが一般的かと思うのですが、 最終行のデータ(「,」で区切られた最も左のフィールド)だけを取り出したいので、 以下のように書いてみました。 <?php $file = fopen("hoge.csv","a+"); $nakami = fgetcsv ($file, 1000, ","); echo $nakami[0]; fclose($file); ?> 「fopen」のmodeについて、「r」にすれば先頭から読み込まれ、 「a+」もしくは「ab+」ならばファイルの終わりにポインタが来る・・・ と色々なマニュアルに書かれていましたので、上記のようにしてみたのですが、 $nakami[0]で表示されるのは、1行目の最左列のデータになってしまいます。 1)このやり方(modeの設定)では最終行のデータ取得は不可能なのか 2)どのようなやり方なら最終行のデータ(のみ)は取得できるのか お知恵をお借りできれば幸いです。 よろしくお願いいたします。

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

みんなの回答

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.3

No1です。No2の回答の方が確実です。 「予め行数がわからないときに、最後の要素(最終行のデータ)というのはどのようにしたら取り出せるものなのでしょうか。」 $file = fopen("hoge.csv","r"); $contents = file($file); とした場合、配列$contentsに各行が格納されるから count($contents)で要素の数を調べて、最終行は $contents[count($contents)] になる。よって $nakami=expload(',',$contents[count($contents)]); echo $nakami[0]; かな。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

仮にファイルポインタが最後にきてしまったら結局 読むものはないでしょ? (最後の行の最初の文字にシークするのではないんだから) 一行の文字数が固定であれば、fseekする手もありますが・・・。 普通にwhileでまわすので十分だと思いますけどね。 <?php $fp = fopen("hoge.csv","r"); while( !feof($fp) ){ $nakami = fgetcsv($fp, 1000, ","); } fclose($fp); echo $nakami[0]; ?>

kumatti51
質問者

お礼

回答、ありがとうございます。 whileでやった場合、全データが取り込まれますが、 その中から、どうやって目的(最終行、最左列)のデータのみを 取り出せば良いのかが分からず手こずって質問させていただいた次第です。

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

$file = fopen("hoge.csv","a+");でポインタを 最後に移動させるのは、ファイルへの追記書き込み を行うためにやるもので、逆順に読み込みするための ものではありません。 最初に、file()関数でファイル全体を配列に格納し、 最後の要素を','を区切りとしてexpload()で分解して、 その最後の行の要素を得れば? (ただし、これだと実際は全件読み込む事になりますが)

kumatti51
質問者

お礼

早速の回答、ありがとうございます。 やはりmodeは、私のような目的のためのモノではないんですね。 勉強になりました。 ところで、教えていただいた 「最後の要素を','を区切りとしてexpload()で分解して」 のところなのですが、exploadについてはおそらく「,」をデリミタにして フィールド毎に分けていくということだと思うのですが、 予め行数がわからないときに、最後の要素(最終行のデータ)というのは どのようにしたら取り出せるものなのでしょうか。 初歩的な質問で恐縮ですが、その点だけ補足いただけますと幸いです。 よろしくお願いいたします。

関連する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
  • 【PHP】CSVファイルの特定行を書き出す

    PHPでCSVファイルを読み込み、特定行のみを別のCSVファイルに書き出したいと思います。 作りたいものは、 http://example.com/file.php?repert=5 とすると、「002.csvファイルの5行目のみ」を「003.csv」に書き込むというものです。 下記で作りましたが、 Parse error: syntax error, unexpected end of file in C:\xampp\htdocs\file.php on line 32 になります。 指摘された32行は ?> の行です。 ググると改行コードのトラブルのようでしたのでCR+LF CR LF と試しましたが、改善されません。 どこが不味いかご教示戴けませんでしょうか? 宜しくお願い致します。 <?php $repeat = $_GET['repert']; $inFile = '002.csv'; // 抽出元ファイル $outFile = '003.csv'; // 結果ファイル $inFp = fopen($inFile, 'rb'); $outFp = fopen($outFile, 'w'); while ($data = fgetcsv($fp, 10000)) { if ($count == $repeat) { { $outLineArray = array( 0 => $data[0], 1 => $data[1], 2 => $data[2] ); fputs($outFp, implode(",", $outLineArray) . ""); } } fclose($inFp); fclose($outFp); exit(); ?>

    • 締切済み
    • PHP
  • PHPでCSVファイルの特定行のみ表示

    PHPでCSVファイルを読み込ませるにあたり、「クエリで指定した特定の1行だけ」を取りだしたいと考えています。 下記だと、1行目からクエリで指定した特定行までの抽出が可能です。 hoge.php?repert=5  → 1から5行目までが表示される。 従い、下記から特定行より上の行を削除すれば、当方が考えている「クエリで指定した特定の1行だけ」を取りだすことになりますが、その方法がわかりません。 ご教示いただきたくお願いいたします。 <?php $repeat = $_GET['repert']; $fp = fopen("file2.csv", "r"); $count = 1; while ($data = fgetcsv($fp, 10000)) { if ($count > $repeat) { break; } print <<<EOD $data[0]・$data[1]・$data[2]<br> EOD; $count++; } fclose ($fp) ?>

    • ベストアンサー
    • PHP
  • PHP5でCSVの指定行データだけを取得するには?

    PHP初心者です。 下記のような方法で全てのデータを取得する方法があると知りました。 $fp = fopen("url.csv", "r"); while ($data = fgetcsv($fp, 1)) { foreach ($data as $d) { print $d . "<br>\n"; } } しかし指定行、例えば10行目等だけを取得する方法がわかりません。 CSVは1列で1000行ほどあります。 恐れ入りますが具体的なソースを教えてくださいませ。

    • ベストアンサー
    • PHP
  • 外部のCSVファイルをPHPで読み込み、出力させたい

    下記の質問を参考に外部のCSVファイルをPHPで読み込み、出力させるphpを書きました。 http://oshiete1.goo.ne.jp/qa1615206.html data.csvは "データ01" "データ02" "データ03" ・・・ といったように100行書いてあります。 <1ページ目に記述したphp> <?php $fp = fopen("data.csv", "r"); $repeat = 10; $count = 1; while ($data = fgetcsv($fp, 10000)) { if ($count > $repeat) { break; } print <<<EOD $data[0] EOD; $count++ ; } fclose ($fp) ?> 2ページ目には11行目からのデータを出力したいと思い、 $data[0]の部分を$data[11]に変えたり、 $repeat = 20; $count = 11;にしたりしたのですが、 両方ともうまくいきませんでした。 2ページ目にcsvの11行目からのデータを出力するにはどうすればいいのでしょうか? 私がしたいことは、1ページ目にcsvの1~10行目を、2ページ目にcsvの11~20行目を出力したいとおもっております。 上記のphp以外の記述でも構いませんので、どなたかお分かりになる方がいらっしゃいましたら是非教えて下さい。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • CSVファイルを読み込み表示すると行頭がおかしくなります

    ・CSVファイルを読み込み表示すると行頭がおかしくなります。 -【 CSVファイル(test.csv) 】------------------- 1,単一,必須 2,…,… ----------------------------------------- ・例えば上記のCSVを読み込んで、  PHPで表示すると以下のように表示されます。 -【 ブラウザ表示 】-------------------------- 1 P一 K須 2 … ----------------------------------------- ・というように最初の文字が正常に表示されません。 ・ちなみに数字(半角?)はちゃんと表示されました。 ・プログラムは下のような感じになります。 ・どこを編集すればよいでしょうか? -【 PHP 】--------------------------------- <?php  if( $fp = fopen( 'test.csv', 'r' ) ){   $data = fgetcsv( $fp );   while( ( $data = fgetcsv( $fp ) ) !== FALSE ){    echo $data[0] . ' ' . $data[1] . ' ' . $data[2] . '<BR>';   }  } ?> ----------------------------------------- -【 仕様 】--------------------------------- [OS]: CentOS5 [Server]: Apache_2.2.10 [PHP]: PHP_5.2.6 -----------------------------------------

    • ベストアンサー
    • PHP
  • PHPで、CSVファイルを、指定した行数だけ出力するには?

    同じようなトピックは、いくつかありましたが、あと一歩、わからないので質問させてください。 CSVファイルをPHPを使って読み込み、出力させる場合で、 CSVファイル data.csv --------------------------- データ1,説明,詳細 データ2,説明,詳細 データ3,説明,詳細 データ4,説明,詳細 データ5,説明,詳細   … データ100,説明,詳細 --------------------------- 上記のように100行あったとします。 この時、 PHPファイルを、 --------------------------- <?php $fp = fopen("data.csv", "r"); while ($data = fgetcsv($fp, 10000)) { $num = count ($data); print <<<EOD $data[0]・$data[1]・$data[2]<br> EOD; } fclose ($fp) ?> --------------------------- と書くと、100行目まで普通に出力してしまいます。 もし、10行目までを出したい場合は、どう記述すればよいのでしょうか? 上記のPHPソースに少し書き加える形で解決できればと思うのですが・・・ 色々試しましたが、私の力だけでは無理でした。

    • ベストアンサー
    • PHP
  • PHP、CSVファイルの日本語データが表示されない

    どうもこんにちわ。PHP初心者です。 どうか助けてください! CSVファイルを読み込んで表示させるプログラムなんですが、 サーバーが変わったら、日本語のデータのみ表示されなくなりました。 以前質問があった下記件と同じ事象で、 参考に色々試してみましたが上手くいきません。 http://oshiete1.watch.impress.co.jp/qa5972094.html ソースは下記です。 どうか、どこをどういじれば良いか、どなたか教えて頂けないでしょうか? 何卒よろしくお願いします。 ------------------ <?php //今日の日付を取得 $today = date("Ymd"); //表示数の設定。 $disp_num = 1; //CSV格納先 $fp = fopen("data/today_word.csv", "r"); while ($data = fgetcsv($fp, 10000)) { for($n = 0; $n < count($data); $n++){ $data[$n] = mb_convert_kana($data[$n], "ak", "SJIS"); } if ((ereg($today,$data[0]))) { $result[] = "<a href='$data[2]'>$data[1]</a><br />"; } } fclose ($fp); ?> -----------------------------

    • ベストアンサー
    • PHP
  • 1行目と2行目の間にデータを書き出すには・・・。

    私はプログラマではないのですが、会社でPHPプログラムの修正を頼まれてしまいました。 ■現在のプログラム ----------------------------------- $fp = fopen( $CSVFileName, "a+" ); $a = fseek($fp,0,SEEK_END); $ret = fputs( $fp, $CSV_SJIS); fclose($fp); ----------------------------------- 現在は、以上のような方法で新しいデータを追加しているのですが、これをデータファイルの2行目に追加するように変更して欲しいと言われています。 なぜ、そのような要求が出たかというと、データファイルというのがCSV形式のファイルで、1行目にはExcelで処理するための列名(項目名)が入っています。よって2行目に新しいデータを追加したいのです。 どなたか詳しい方がいらっしゃいましたら、回答をお願い致します。

    • ベストアンサー
    • PHP
  • CSVデータを使ったページングとソート

    phpをやり始めて3ヶ月くらいですが、高度な事がまだまだわかりません。どなたかお知恵を拝借願えないでしょうか? fgetcsvを使って一覧表示をしidからそのデータの詳細をsyousai.phpへ送って表示するようにしています。 この一覧表示にページングとソート機能をつけたいのですが、どうやったらよいかわかりません。 <? $fname = "list.csv"; $file = fopen($fname, "r"); while (list( $data0, $data1, $data2, $data3, $data4) = fgetcsv($file, 1000, ",")) { ?> <table> <tr> <td> <form action="syousai.php" method="get" name="code"> <a href="syousai.php?id=<? echo $data0;?>" name="id">詳細</a> </form> </td> <td>番号:<? echo $data0;?></td> <td>名前:<? echo $data1;?></td> </tr> </table> <? } ?> <? fclose($file); ?> と、言うようなソースです。 こんなやり方でいいのかも不明ですがこの中にページングとソートの機能を追加したいと思っています。

    • ベストアンサー
    • PHP