質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

12044閲覧

SplFileObjectで改行を含むcsvファイルを読み込むと最初の改行が1つなくなる?

msx2

総合スコア174

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/12/29 02:15

PHPを使ったプログラムでCSVファイルをアップロードしてテーブルに保存する処理を作りました。

テストをして気づいたのですが、どうやらCSVファイルに改行が含まれていると最初の1つがなくなるみたいです。

自分なりに試してみた結果、ファイルは正しく読めていてそのままテキストファイルとして保存すると改行は残っていました。また文字コードは変換してもしなくても結果は変わらず、改行コードはCR+LFでもLFでも同じ結果です。

SplFileObjectがcsvを読み込むと発生するみたいです。

ちなみにfgetcsvで読み込むと改行は消えず期待通りのデータが取得できます。

改行の含まれるcsvファイルはcsvじゃない!というご意見は承知していますが業務上必要なのでそうも言ってられません。

SplFileObjectのREAD_CSVのバグでしょうか?
できればSplFileObjectを使いたいと思っているので回避方法があれば教えていただきたいです。

※今の環境はPHPやサーバーの設定は変更できない状況です・・

PHP

1$filename = $getfile[0]['saved_to'] . $getfile[0]['saved_as']; 2$spec = "php://filter/read=convert.iconv.cp932%2Futf-8/resource=$filename"; 3$file = new \SplFileObject($spec, 'rb'); 4$file->setFlags( 5 \SplFileObject::READ_CSV | 6 \SplFileObject::SKIP_EMPTY | 7 \SplFileObject::READ_AHEAD | 8 \SplFileObject::DROP_NEW_LINE 9); 10foreach ($file as $i => $row) { 11 //1行目を読み飛ばす 12 if ($i === 0) { 13 continue; 14 } 15 var_dump($row); 16}
//CSVデータ name,options,explanation POUCH-A,"COLOR BK BL WH SIZE S M L","テスト テスト" POUCH-B,"","テスト テスト"

PHP

1//結果 2//1件目のデータは COLOR BK BL WHの次の改行がなくなっています 3//2件目のデータはテストの次の改行がなくなっています 4array (size=3) 5 0 => string 'POUCH-A' (length=7) 6 1 => string 'COLOR BK BL WH 7SIZE S M L' (length=26) 8 2 => string 'テスト 9 10テスト' (length=22) 11 12/var/www/html/aaa/controller/upload.php:59: 13array (size=3) 14 0 => string 'POUCH-B' (length=7) 15 1 => string '' (length=0) 16 2 => string 'テスト 17テスト' (length=20)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

DROP_NEW_LINEの設定を外すと、改行はなくならないみたいですよ。
詳しくはわかりませんが、DROP_NEW_LINEの仕様かもしれませんね。

投稿2016/12/29 09:16

popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

msx2

2016/12/29 09:29

ありがとうございます!! 確かにDROP_NEW_LINEは空行を読み飛ばす指定なのでそういう動作をしても不思議ではありませんね。 SplFileObjectのパラメータオプションを変えて試してみるというのは全く頭になかったです。。 まだまだ力不足ですがまた一つ勉強になりました。 いつもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問