2013-06-03 124 views
2

我有一个CSV文件中像下面(它有大约500行)解析CSV - 随机输出

ID,Title,LastName,HouseNo,Street,City,Postcode,Telephone 
1209109,Miss,Test,1635,Test Road,Test, AB12 2EF, 
1209833,Mrs,Test,3,Test Close,Test,BB12 2EF, 
1205839,Miss,Test,1,Test Road,Test,AA12 2EX, 

然后我用下面的PHP:

$handle = fopen($csvFile, "r"); 
$imports = array(); 

$row = 1; 
echo "<table>"; 
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
{ 
     // skip headers 
     if($row == 1){ $row++; continue; } 
     echo "<tr>"; 
     echo "<td>$data[0]</td>"; 
     echo "<td>$data[1]</td>"; 
     echo "<tr>"; 

} 
echo "</table>"; 
fclose($handle);` 

我希望像:

1209109 Miss 
1209833 Mrs 

但由于某些原因,它似乎开始在文件中的一个随机点,然后输出一些在日数据错误的<td>

问题可能是每行的尾随逗号吗?

感谢

+0

我从来没有在每个lin的末尾看到一个带有逗号的CSV文件e,你有没有尝试删除它们 – meda

+1

我假设一个尾随的逗号只会给输出添加一个额外的空列......我怀疑这是你的问题 –

+2

@meda,我一直都在看。当有人没有最后一列的数据时,却懒得检查。一个CSV解析器不应该失败。 – MarioP

回答

1

我猜您遇到的问题是线(EOL)不匹配的结束。基本上,fgetcsv()函数会根据换行符分解文件,但它的字符与正在使用该文件的字符不同(例如,\n\r vs \r vs \n)。结果是该函数仅抓取第一个1000字符(按照函数调用)并将其作为第一行,然后抓取下一个1000字符等等,这会导致稍微随机的输出。

你也许可以尝试是这样的:你抢文件前

ini_set('auto_detect_line_endings', true); 

。或者你可以通过手动修改CSV来标准化EOL字符/打开电子表格文件转换,它允许你改变EOL字符(即Unix和Windows

0

我还没有能够重现你的您提供的数据出错(即使留下或删除了逗号),但我确实注意到您没有在您提供的代码中关闭您的表格行。

我没有认为这会导致您的显示错误,但您可能想要更改您的代码:

$row = 1; 
echo "<table>"; 
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
{ 
    // skip headers 
    if($row == 1) { 
    $row++; 
    continue; 
    } 
    echo "<tr>"; 
    echo "<td>$data[0]</td>"; 
    echo "<td>$data[1]</td>"; 
    echo "</tr>\n"; 

} 
echo "</table>"; 
fclose($handle);