• ベストアンサー

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