围栏是围绕该领域的角色 . 它是一种额外的分隔符 .
例如 hello,world 的逗号为 field 分隔符,没有 text 分隔符,而 "hello","world" 的引号为 text 分隔符 . 有些系统使用分隔和不限值来分别表示文本和数字字段(我相信Microsoft Excel可以) . 这允许字段在其值中包含字段分隔符:
"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));
我似乎无法重现您遇到的问题;它可能与行结尾的不同编码有关(即,CRLF而不是LF)?
在紧要关头,您可以在两个组件 fgets 和 str_getcsv() 中分割 fgetcsv ,操纵调用之间的线(使用 trim ,或者如果更糟糕的话,通过附加缺少的逗号来加剧) .