2010-07-01 37 views
0

我正在处理一个CSV文件和PHP5,但是我不完全理解我所看到的。该文件是当我在一个文本编辑器打开它,如下所示:Fgetcsv初始行读取

"Jun 23,2010 21:40","City1","Location1","0 0 0 " 
"Jun 23,2010 21:41","City2","Location1","0 0 0 " 

我得到了来自该代码的输出:

while (($data = fgetcsv($handle, 1000, ",","\"")) !== FALSE) { 
     $num = count($data); 
echo "<p> $num fields in line $row: <br /></p>\n"; 
$row++; 
for ($c=0; $c < $num; $c++) { 
    echo $data[$c] . "<br />\n"; 
} 
} 
fclose($handle); 

这是输出:

5 fields in line 1: 
"Jun 23 
2010 21:40" 
City1 
Location1 
0 0 0 

4 fields in line 2: 
Jun 23,2010 21:41 
City2 
Location1 
0 0 0 

如您所见,在第一行fgetcsv跳过外壳字符并将逗号读作第一个字段,而第二个字段ne正确读取,然后在所有行之后进行读取。

所以我错过了什么,或者这是一个错误,如果它是一个错误,除了重写原始文件之外,什么是一些可能的解决方案?

回答

1

你的代码(满):

<? 
$handle = fopen('test.csv', "r"); 
while (($data = fgetcsv($handle, 1000, ",","\"")) !== FALSE) { 
    $num = count($data); 
echo "<p> $num fields in line $row: <br /></p>\n"; 
$row++; 
for ($c=0; $c < $num; $c++) { 
     echo $data[$c] . "<br />\n"; 
} 
} 
fclose($handle); 
?> 

解析您发布上述正确的数据:

TAIFUN:测试killerx $ PHP test.php的

4字段行:

Jun 23,2010 21:40
City1
LOCATION1

4在第1行的字段:

君23,2010 21时41
城2
LOCATION1

也许你有一个“编码错误”的标志。像“”或“或˝。他们可能看起来很相似,但不一样的东西”。

+0

经过检查围绕代码,我认为你是对的,并且在实际文件中可能会搞砸fgetcsv。我复制并粘贴整个文件在一个文本编辑器到一个新的文件,跑了,没有问题。该文件正在由iMacoros脚本编写,并以某种方式混淆了二进制级别的格式,因为在文本中它们看起来完全相同。 – ruskiar 2010-07-02 21:27:01

+0

挖掘更多一点,事实证明fgetcsv不喜欢UTF-8编码,所以在一个小文件转换后,一切都像一个魅力。 – ruskiar 2010-07-02 21:53:47

0

我有同样的问题。 它来自编码。 我转换的CSV文件中的‘UTF-8无BOM’,它解决了。

0

我发现这种情况,如果该文件是UFT8编码,并包含BOM解决此问题的简单方法是由3个字节转发文件指针开盘后,然后开始取线CSV:

$f = fopen('file.csv', 'r'); 
fread($f, 3); 
while(($line = fgetcsv($f)) { 
    // do some stuff 
}