はてなあたまさんのブログです。

WEB開発勉強中でーす

csvインポートする時、”¥n”(改行コード)が入っていると認識されてしまった件

csvをインポートする時、”¥n”(改行コード)が入っていると認識されてしまった。
めっちゃくちゃ普通な(?)コードで
どこが間違っているかしらんかったが・・
犯人は「SplFileObject」オブジェクトの
setFlagsというcsvファイルを読み込むフラグを
指定するやつでした・・・。
    $file->setFlags(
        \SplFileObject::READ_CSV |
        \SplFileObject::SKIP_EMPTY |
        \SplFileObject::READ_AHEAD |
        \SplFileObject::DROP_NEW_LINE <-問題のやつ
    );
ここで
SplFileObject::DROP_NEW_LINE
というのが設定されていると改行が入っていると
改行されてしまいそうだった。
DROP_NEW_LINE フラグを削除したら問題なくうまく
いけた!!
英語版マニュアルには
SplFileObject::DROP_NEW_LINE

Drop newlines at the end of a line.

と書いてあるので、そう思っている!
日本語版はなんか難しい説明だったT-T
テストコードは
public function csvReading():String
{
    $f = WWW_ROOT . "222.csv";
    $file = new \SplFileObject($f);
    $file->setFlags(
        \SplFileObject::READ_CSV |
        \SplFileObject::SKIP_EMPTY |
        \SplFileObject::READ_AHEAD
    );
    $list = "<table>";
    while(!$file->eof()){
       $line = $file->fgetcsv();
       $list = $list . "<tr>";
       foreach ($line as $a) {
           $list = $list .  "<td>" . $a . "</td>";
        }
        $list = $list .  "</tr>";
    }
    $list = $list .  "</table>";
    return $list ?? "";
}

定義済み定数 ¶

SplFileObject::DROP_NEW_LINE

行末の改行を読み飛ばします。

SplFileObject::READ_AHEAD

先読み/巻き戻しで読み出します。

SplFileObject::SKIP_EMPTY

ファイルの空行を読み飛ばします。期待通りに動作させるには、READ_AHEAD フラグを有効にしないといけません。

SplFileObject::READ_CSV

CSV 列として行を読み込みます。