2009-09-24 47 views
4

我正在用php讀取CSV文件。許多行都有一個「複選標記」,它實際上是平方根符號:√並且每次遇到時,php代碼都會跳過此字符。PHP中某些字符不會被讀取fgetcsv()

這裏是我的代碼(打印在「CSV風格」格式的瀏覽器窗口,這樣我就可以檢查系在正確的地方突破:

$file = fopen($uploadfile, 'r'); 
while (($line = fgetcsv($file)) !== FALSE) { 
    foreach ($line as $key => $value) { 
    if ($value) { 
     echo $value.","; 
    } 
    } 
    echo "<br />"; 
} 
fclose($file); 

作爲過渡方案,我只是發現和在Excel中用1手工替換複選標記。很明顯,我想要一個更高效的解決方案:)感謝您的幫助!

+0

我使用''fgetcsv在過去的()有很多的問題。當我遇到這些類型的問題時,我通常會開始手動解析文件。 = \ – pix0r 2009-09-24 16:48:54

+0

已知有fgetcsv()和非ASCII字符的錯誤,特別是在未加引號的值開頭。另請參閱http://stackoverflow.com/questions/2238971/fgetcsv-ignores-special-characters-when-they-are-at-the-beginning-of-line – eswald 2012-01-26 20:13:54

回答

4

fgetcsv()僅適用於標準ASCII字符;所以跳過你的平方根符號可能是「正確的」。但是,不必手動替換檢查標記,您可以將文件讀入字符串,對這些字符執行str_replace(),然後使用fgetcsv()對其進行解析。你可以把字符串轉換成一個文件指針(對於fgetcsv)正是如此:

$fp = fopen('php://memory', 'rw'); 
fwrite($fp, (string)$string); 
rewind($fp); 
while (($line = fgetcsv($fp)) !== FALSE) 
... 
1

我不得不用繩子重音第一字符類似的問題。我最終放棄了fgetscv,做以下,使用fgets()explode(),而不是(我猜你的CSV是逗號分隔):

$file = fopen($uploadfile, 'r'); 

while (($the_line = fgets($file)) !== FALSE) // <-- fgets 
{ 
    $line = explode(',', $the_line);   // <-- explode 
    foreach ($line as $key => $value) 
    { 
    if ($value) 
    { 
     echo $value.","; 
    } 
    } 
    echo "<br />"; 
} 

fclose($file); 
+0

我對此解決方案有疑問:http:// stackoverflow.com/questions/14836653/php-fgetcsv-not-reading-first-utf-8-caracter-alternatif-using-fgets – StiGMaT 2013-02-12 16:16:24

0

你應該的setlocale AR寫在文件

注意: 該功能考慮到語言環境設置。如果LANG是例如en_US.UTF-8,單字節編碼的文件被這個函數讀錯了。

之前fgetcsv附加的setlocale(LC_ALL, '的en_US.UTF-8')。在我的情況下,它是'lt_LT.UTF-8'。

這種行爲被報告爲php bug