2010-07-01 56 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 
}