やりたかったこと
csvのファイルを読み込んで内容を配列に入れる
aaa,bbb,ccc
aaa,bbb,ccc
を
array(
   0 => array(
       0 => "aaa",
       1 => "bbb",
       2 => "ccc"
   ),
   1 => array(
       0 => "aaa",
       1 => "bbb",
       2 => "ccc"
   )
)
にする。
やったこと
Format::forge(File::read('test.csv', true), 'csv')->to_array();
みたいな感じ。
ハマったこと
ファイル内の改行が改行と判断されたりされなかったりする
期待通りの配列ができた例
test11,test12,test13
test21,test22,test23
array(
   0 => array(
       0 => "test11",
       1 => "test12",
       2 => "test13"
   ),
   1 => array(
       0 => "test21",
       1 => "test22",
       2 => "test23"
   )
)
期待通りの配列ができなかった例
test11,test12,aaa
test21,test22,bbb
array(
    0 => array(
        0 => "test11",
        1 => "test12",
        2 => "aaa
test21",
        3 => "test21",
        4 => "test22",
        5 => "bbb"
    )
)
csvフォーマットのデフォルト設定を確認
| 項目 | 値 | 
|---|---|
| 区切り文字 | , | 
| 囲い込み文字 | " | 
| 改行 | \n | 
| エスケープ文字 | | | 
'csv' => array(
        'import' => array(
                'delimiter' => ',',
                'enclosure' => '"',
                'newline'   => "\n",
                'escape'    => '\\',
        ),
        'export' => array(
                'delimiter' => ',',
                'enclosure' => '"',
                'newline'   => "\n",
                'escape'    => '\\',
        ),
        'regex_newline'   => "\n",
        'enclose_numbers' => true,
),
デフォルトだと、csvの値を「"」で囲まないとダメ?
でも想定通りの配列ができる場合もある。。
仕方なくソースを読む
if (empty($enclosure))
{
	$rows = preg_split('/(['.$newline.'])/m', trim($string), -1, PREG_SPLIT_NO_EMPTY);
}
else
{
	$rows = preg_split('/(?<=[0-9'.preg_quote($enclosure).'])'.$newline.'/', trim($string));
}
どうやら「" or 0-9の数字」+「\n」を改行する場所として判断してるみたい。。
enclosureを空に設定することで以下も期待通りの配列にできた。
test11,test12,aaa
test21,test22,bbb
まとめ
- enclosureを空文字に設定することで解決した
- フレームワークの動作を予想してはいけない(予想通りになることをテストする)
- 予想通りにならなかったらソースを読む
- 正規表現に0-9を入れている不思議