• ベストアンサー

csvファイルに複数行あるデータの取り込め方は?

環境はxp、apache2、php5、Postgresql8.2です。 1台のPCをサーバ&クライアントにしています。 ただ今PHPとPostgresqlの勉強をしています。 いつも質問に答えてくれてありがとうございます。 以下のようにしてcsvファイルを読み込む処理をしています。 --------------------------- //ファイルを開く $fd = fopen ("c:\Book5.csv", "r"); //データを読み込む while (!feof ($fd)) { //「,」区切りでデータを分割 $line = split(",",fgets($fd)); --------------------------- ここで問題となるのは、 一つのデータに複数行ある場合、取り込む事が出来ません。 (行の最後と判断されるため?) どのようにしたら 取り込めますか?

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

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

そのcsvってエクセルあたりでだしてます? csvデータが "あけまして おめでとうございます","ことしもよろしく" というデータであれば、#1でも回答したとおりfgetcsv()で取れます。 改行マークがきちんとクォーテーションでくくられているのが重要。 ただ、トラブルのもとなのでcsvのデータの一部に改行をいれるのは 感心しませんが・・・ またもしSQLにデータを渡したいということであれば、改行マークは 気をつけたほうがよいですね なにか別文字に変えるなどPHP側で処理をを入れたほうがよいかも しれません

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • maura
  • ベストアンサー率46% (48/104)
回答No.4

CSVは、ただカンマで区切られているわけでなく 以下の仕様があります。 1. 原則として 1 行が 1 レコードとなる。 ただし、 フィールド全体を "ダブルクォーテーション で囲むことで、 フィールドの途中で何回でも改行できる。 2. 各フィールドは一つの ,カンマ で区切られる。 ただし、 フィールド全体を "ダブルクォーテーション で囲むことで、 フィールドの中に ,カンマ を使用できる。 3. フィールド内部の "ダブルクォーテーション は 「""」 とエスケープされる。 CSVの取り込みを自分で作るのは意外と大変です。  「CSVは、カンマで区切られている」と言う認識は、間違いです。

参考URL:
http://www.ietf.org/rfc/rfc4180.txt
全文を見る
すると、全ての回答が全文表示されます。
  • wp_
  • ベストアンサー率54% (132/242)
回答No.2

>一つのデータに複数行ある 「一つのデータが複数行ある」のtypoですな^^; header,1,2,3,4 title,test body,a,b header,5,6,7,8 title,hogehoge body,c,d 上記のように一つのデータが何行あるというのが予め判明しているならば $ret = array(); $line=0; $rownum = 0; while(!feof($fhn)) {  $csv = fgetcsv($fhn);  $rownum = intval($line / 3); //3行ごとにデータの始まりが存在  $ret[$rownum][] = $csv;  $line++; } print_r($ret); とすると ret = array(  0 => array(   0 => array('header',1,2,3,4)   ,1 => array('title','test')   ,2 => array('body','a','b')  ),  1 => array(   0 => array('header',5,6,7,8)   ,1 => array('title','hogehoge')   ,2 => array('body','c','d')  ) ) が得られます。(動作は未確認) この辺はプログラマとして創意工夫できるところです。 が、特殊な仕様のCSVを読む場合はあまりこういうことをしません。 オブジェクト内で生のデータを保持し、データを取り出すときに必要なものだけを取捨選択できるようにしたり そもそも生データをXML形式へ移行できないか検討します。 勉強中であればこの辺を考察するのはまだ先かと思われますが、一応言及しておきます。

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>一つのデータに複数行ある 意味がよくわかりませんが、csvの取り込みなら fgetcsv()あたりをご利用になっていはいかがですか? http://www.php.net/manual/ja/function.fgetcsv.php

wee
質問者

補足

説明不足でした。 申し訳ありません。 >一つのデータに複数行ある というのは、 --------------------------- あけまして おめでとうございます --------------------------- これが一つのセルに入っていると言うことです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • csv読み込みについて

    基本的なことかも知れませんが、調べても分からなかったので質問です。 phpでcsvファイルを読み込むプログラムを書いているのですが、 $handle = fopen('***.csv', 'r'); while (!feof($handle)){ $data = fgets($handle); という方法で読み込んでいます。 このcsvファイルの一行目をとばして読み込みたい(二行目から読み込む) のですが、何か良い方法はないでしょうか?

    • ベストアンサー
    • PHP
  • 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
  • ファイルの中の行数を確認して、減らす

    今phpで掲示板を作っている初心者ですが、 ファイルの中の行数を確認してから、 ある一定数をオーバーしたら古いものからけしていく作業を したいのですが、上手く行きません。 ファイルの行数を確認する方法は、 $count=0; $fd=fopen("$filename","r"); while(!feof($fd)){ $data = fgets($fd); $count++; } な感じで、whileしか無理ですかね? この方法だとデータが多くなると心配です。 何かもっと良い方法はないでしょうか? また上で行数を調べて、例えば行数が100件を越したら一行消し、 それを再度ファイルに書き込むにはどうしたらよいのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • 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ファイルを読み込んで処理しています。 $handle = fopen(ファイル名,"r"); while (!feof($handle)){ $filedata = fgets($handle); $record = explode(",", $filedata); というようにやっているのですが、 ファイルの最終行の改行コードを除去する方法が分からなくて困っています。 何か良い方法は無いでしょうか

    • 締切済み
    • PHP
  • csv形式のデータの読み込み

    csv.txt(unicode形式で保存し、ffftpでバイナリ転送モードでアップロード) =================================================================== J-0001,亜,1 J-0002,哀,2 J-0003,愛,3 J-0004,悪,4 =================================================================== のデータを、phpで読み込み、ブラウザに表示できません。 以下がソースです。いろいろ検索したり調べたりみたのですが、 だめでした。phpのヘッダーは「charset=utf-8」です。 ファイルを開いたときなのかわからないのですが、 文字化け?が起きているように思えます。 文字コードがおそらく原因だと思うんですが、行き詰まりました。 phpソース =================================================================== $data_txt = "csv.txt"; $fp = fopen($data_txt, "r"); if ($fp == false) { printf("data.txtを開けませんでした。"); return; } $count = 0; while (!feof($fp)) { $strs[$count] = fgets($fp); $strs[$count] = split(",", $strs[$count]); $count++; } printf($strs[0][1]); printf($strs[1][1]); printf($strs[2][1]); printf($strs[3][1]); =================================================================== 表示させたい実行結果 ===================== 亜哀愛悪 =====================

    • ベストアンサー
    • PHP
  • windowsで書き込んだファイルをサーバーに送ると改行が追加され2行のデータになる。

    QNo.1112250ディストリビューション質問をさせていただいたものです。 windowsで作成したファイルをサーバーに送り、PHPでデータを読み込むと空の行が追加されます。 1)windowsでのデータは「"name",111」ですが、エディター(TeraPad)で下記のように表示されます。([EOF]が1行下に表示されます。) "name",111 [EOF] 2)このデータをサーバーに転送し下記のように読み出すと2行分のデータとして読まれます。2行目は空のデータになっています。 while(!(feof($fp))){ $buf=fgets($fp,100);      $buf=chop($buf); $data=split(",",$buf); $name[$count]=$data[0]; $password[$count]=$data[1]; 空の行を読まないようにする方法をご教示いただけませんか。よろしくお願いします。

    • ベストアンサー
    • PHP
  • pg_queryでinsert処理が出来ない

    環境はxp、apache2、php5、Postgresql8.2です。 1台のPCをサーバ&クライアントにしています。 ただ今PHPとPostgresqlの勉強をしています。 phpiniの文字コードの設定 PHPプログラムをShift_JISで保存し、ブラウザへEUC-JPで出力する csvデータを「Book1」読み込んで、 bbというテーブルに格納するために 以下のようにしましたが エラーになってしまいます。 ご教示して頂けたら幸いです。 --------------------------- if($_POST['action'] && $_POST['sign'] == 'up') { //ファイルを開く $fd = fopen ("c:\Book1.csv", "r"); //データを読み込む while (!feof ($fd)) { //「,」区切りでデータを分割 $line = split(",",fgets($fd, 50)); //クエリの実行 $sql = "insert into bb (syain,name,buka) values ('\{$line[0]}\','\{$line[1]}\',{$line[2]})"; pg_query($d_base,$sql); } } --------------------------- 「Book1」の内容 001,山田,100 002,佐藤,200 003,斉藤,300 ・ ・ ・ --------------------------- エラー内容 Warning: pg_query() [function.pg-query]: Query failed: ERROR: invalid byte sequence for encoding "EUC_JP": 000002 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding". in C:\aa.php on line 48 山田

    • ベストアンサー
    • 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
  • VBでCSVファイルのある行をインポート

    VBでCSVのインポートをしたいのです。 CSVファイルの中身で、最初の5行は読みません。そして、カンマ区切りの行の最初の文字が数字である場合だけを読みたいのです。で最後の3行も読みません。 ですので、CSVのデータを読む場合に最初の5行を飛ばすという方法か、カンマ区切りの行の最初の文字が数字の場合だけ読むという方法はありませんでしょうか。 Line Input #intFileNo, strTextLine strTextLine = Replace(strTextLine, """", "") str = Split(strTextLine, ",") こんな感じのコードで考えてます。 お分かりの方いましたらお願いします。