2013-06-03 88 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);