为什么 fgetcsv() 函数将连续的 EMPTY 字段聚合为一个字段,并将其放入一个数组位置?
Why is fgetcsv() function aggregating the consecutive EMPTY fields into ONE field, and putting it into ONE array position?
这是 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
我得到的输出:
我得到的实际输出:
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] => )
问题:
首先,为什么我得到那些 random 逗号? 我说 random因为可以看到,第一个元素a
后面有逗号,那么第二个元素b
后面没有逗号,c
后面没有逗号要么(等等)。
对于没有值的字段,即为空的字段,为什么要聚合几个字段,例如在索引 18
处显示的字段中,大约 14
个 EMPTY 字段已聚合并放入一个数组位置。 为什么?结果是这个输出数组应该包含 43 个元素,现在包含 26 个。
如何解决这些问题并获得预期的输出?
注意:我可以更改 CSV 文件中的分隔符和字段包围值。
您 fgetcsv
的参数有误。 Note the second parameter, length,你错过了。事实上,因为您似乎只需要默认行为,所以这应该有效:
while ( !( ($line = fgetcsv($file)) === false ) ) {
您在原始代码中实际做的是将 CSV 行长度设置为“,”,将定界符设置为双引号,而不是设置围栏,这意味着它也默认为双引号。这显然混淆了解析器。
(顺便说一句,您可能还想在使用文件之前确保该文件存在,否则您的代码将进入无限循环,因为 fgetcsv returns NULL。)
我的问题是我的 PhpStorm 编辑器在 phpstorm 设置 Editor->general->Skip trailing spaces = none
这是 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
我得到的输出:
我得到的实际输出:
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] => )
问题:
首先,为什么我得到那些 random 逗号? 我说 random因为可以看到,第一个元素
a
后面有逗号,那么第二个元素b
后面没有逗号,c
后面没有逗号要么(等等)。对于没有值的字段,即为空的字段,为什么要聚合几个字段,例如在索引
18
处显示的字段中,大约14
个 EMPTY 字段已聚合并放入一个数组位置。 为什么?结果是这个输出数组应该包含 43 个元素,现在包含 26 个。
如何解决这些问题并获得预期的输出?
注意:我可以更改 CSV 文件中的分隔符和字段包围值。
您 fgetcsv
的参数有误。 Note the second parameter, length,你错过了。事实上,因为您似乎只需要默认行为,所以这应该有效:
while ( !( ($line = fgetcsv($file)) === false ) ) {
您在原始代码中实际做的是将 CSV 行长度设置为“,”,将定界符设置为双引号,而不是设置围栏,这意味着它也默认为双引号。这显然混淆了解析器。
(顺便说一句,您可能还想在使用文件之前确保该文件存在,否则您的代码将进入无限循环,因为 fgetcsv returns NULL。)
我的问题是我的 PhpStorm 编辑器在 phpstorm 设置 Editor->general->Skip trailing spaces = none