为什么fgetcsv()函数将连续的EMPTY字段聚合到一个字段中,并将其置于一个数组位置?

时间:2016-11-20 11:32:15

标签: php csv fopen fgetcsv

以下是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] => ) 

问题:

  1. 首先,为什么我会使用随机逗号?我说随机因为,正如您所看到的,有一个在第一个元素a之后的逗号,然后在第二个元素b之后没有逗号,并且c之后也没有逗号(等等)。

  2. 对于没有值的字段,即空的字段,为什么要聚合几个字段,例如在索引18显示的字段中,大约14 EMPTY字段已汇总并放入一个数组位置。为什么?结果是这个输出数组应该包含43个元素,现在它包含26个。

  3. 如何解决这些问题并获得预期的输出?

    注意: 我可以更改CSV文件中的分隔符和字段机箱值。

2 个答案:

答案 0 :(得分:2)

你有fgetcsv的错误参数。 Note the second parameter, length,你错过了。实际上,由于您似乎只需要默认行为,因此应该可以使用:

while ( !( ($line = fgetcsv($file)) === false ) ) {

您在原始代码中实际执行的操作是将CSV行长度设置为“,”,将分隔符设置为双引号,而不是设置机箱,这也意味着默认为双引号。这显然使解析器感到困惑。

(顺便说一句,您可能还希望在使用之前确保该文件存在,否则您的代码将进入无限循环,因为fgetcsv返回NULL。)

答案 1 :(得分:0)

我的问题是我的PhpStorm编辑器在phpstorm设置Editor-> general-> Skip尾随空格= none时自动删除了尾随空格(也=制表符)