以下是CSV文件:
a.csv:
"a","b",,"c",,"d","e","f",,"g","h","i","j",,,,,,,,,,,,,,"k",,,,,,,,,,,,,,,"l","m,n","o"
现在,在此CSV文件中,,
是字段之间的分隔符。因此,第一个字段为a
,第二个字段为b
,第三个字段为空,第四个字段为c
,为第五个字段再次为空,依此类推。
这是我的示例代码:
的index.php:
$file = fopen("a.csv", "r");
while ( !( ($line = fgetcsv($file, ',', '"')) === false ) ) {
print_r($line);echo "<br>";
}
预期输出:
我希望这段代码能够打印出类似的内容:
Array ( [0] => a, [1] => b [2] => [3] => c [4] => [5] => d ...so on
OUTPUT I GOT:
我得到的实际输出:
Array ( [0] => a, [1] => b [2] => ,, [3] => c [4] => ,, [5] => d [6] => , [7] => e [8] => , [9] => f [10] => ,, [11] => g [12] => , [13] => h [14] => , [15] => i [16] => , [17] => j [18] => ,,,,,,,,,,,,,, [19] => k [20] => ,,,,,,,,,,,,,,, [21] => l [22] => , [23] => m,n [24] => , [25] => o [26] => )
问题:
首先,为什么我会使用随机逗号?我说随机因为,正如您所看到的,有一个在第一个元素a
之后的逗号,然后在第二个元素b
之后没有逗号,并且c
之后也没有逗号(等等)。
对于没有值的字段,即空的字段,为什么要聚合几个字段,例如在索引18
显示的字段中,大约14
EMPTY字段已汇总并放入一个数组位置。为什么?结果是这个输出数组应该包含43个元素,现在它包含26个。
如何解决这些问题并获得预期的输出?
注意: 我可以更改CSV文件中的分隔符和字段机箱值。
答案 0 :(得分:2)
你有fgetcsv
的错误参数。 Note the second parameter, length,你错过了。实际上,由于您似乎只需要默认行为,因此应该可以使用:
while ( !( ($line = fgetcsv($file)) === false ) ) {
您在原始代码中实际执行的操作是将CSV行长度设置为“,”,将分隔符设置为双引号,而不是设置机箱,这也意味着默认为双引号。这显然使解析器感到困惑。
(顺便说一句,您可能还希望在使用之前确保该文件存在,否则您的代码将进入无限循环,因为fgetcsv返回NULL。)
答案 1 :(得分:0)
我的问题是我的PhpStorm编辑器在phpstorm设置Editor-> general-> Skip尾随空格= none时自动删除了尾随空格(也=制表符)