エンクロージャーは、フィールドを囲む文字です。これは、ある種の追加の区切り文字です。
たとえば、フィールド区切り文字hello,world
としてコンマがあり、テキスト区切り文字がありませんが、テキスト区切り文字として引用符があります。一部のシステムでは、区切り値と区切りなしの値を使用して、それぞれテキストフィールドと数値フィールドを示します(Microsoft Excelではそうだと思います)。これにより、フィールドの値にフィールド区切り文字を含めることができます。"hello","world"
"Hello,world","Second Field","Third, and last, field".
他の一部のシステムは、フィールド区切り文字を含む値、または空白を含む値のみを囲みます。つまり、これらのシステムでは、区切られていない値は必ずしも数値ではありません。
「些細な」ケース(値の中にエスケープされたフィールド区切り文字がない、区切られていない値(つまり、'A、firstpartB \、secondpartB、C'のものがない))がある場合は、CSV変換を完全にスキップして実行できます
$line = fgets($file, MAX_EXPECTED_LINE_LEN);
// This splits ' A, B, C ' into 'A', ' B' and ' C' (note spaces)
$row = explode(',', trim($line)); // other delimiters can be used
また
// Consider " , ", "," and ", " as the same delimiter
// i.e. ' Alpha , Beta , Gamma ' gets split into 'Alpha', 'Beta' and 'Gamma'
$row = preg_split('#\\s*,\\s*#', trim($line));
私はあなたが経験している問題を再現できないようです。行末の異なるエンコーディング(つまり、LFではなくCRLF)に関連している可能性がありますか?
fgetcsv
ピンチでは、2つのコンポーネントにfgets
分割しstr_getcsv()
、呼び出し間の行を操作できます(でtrim
、または最悪の場合は、欠落しているコンマを追加して)。