LoginSignup
7
5

More than 5 years have passed since last update.

FuelPHPのformatクラスの改行判定でハマった

Last updated at Posted at 2015-02-07

やりたかったこと

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を入れている不思議
7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5