2011-11-16 75 views
4

csv文件在其記錄中包含'\'字符,因此我無法獲取陣列中鍵值對的確切數量。PHP fgetcsv escape''

我使用PHP fgetcsv函數如下 -

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
    .... 
} 

我也試圖逃脫字符如下。

while (($data = fgetcsv($handle, 1000, ",",'"',"\\")) !== FALSE) { 
    .... 
} 

但它沒有工作。可能的解決方案是什麼?

+0

您是否嘗試過逃跑的CSV文件中的「\」本身。我總是確保以CSV格式保存到平面文件的任何內容都通過'addslashes()'運行,以避免此問題 –

+0

只是在本地運行一些測試。 'fgetcsv()'會在讀取每一行時自動轉義字符,而不會將轉義字符串設置爲缺省值爲反斜槓。我不認爲這是你的問題。你在腳本中使用1000作爲任意長度嗎? –

+2

反斜槓位於.csv文件中單元格的末尾時,escape不起作用。 – Sitansu

回答

5
$handle = @fopen($filename, "r"); 
if ($handle) { 
    while (($buffer = fgets($handle, 4096)) !== false) { 
     $buffer = preg_replace('/(\\\",)/','\\ ",',$buffer); 
     $buffer = preg_replace('/(\\\"("?),)/',' ',$buffer); 
     $data[] = str_getcsv($buffer); 
    } 
    if (!feof($handle)) { 
     echo "Error: unexpected fgets() fail\n"; 
    } 
    fclose($handle); 
} 
3

您可能需要手動修復該文件。如果該文件只有一個斜線,那是最快的。

許多程序不能正確導出爲csv格式。

如果這將會發生很多事情,您可能需要在導入時修復源代碼或更正信息。

+0

由於csv文件是在某些遠程服務器上創建的,而且我使用ftp和它的cron作業導入,它還包含大量的記錄,我無法手動編輯它。還有其他可能的解決方案嗎? – Sitansu

+1

以編程方式解決問題。使用'fgets()',修復破碎的東西,然後通過'str_getcsv()運行固定的字符串'http://www.php.net/manual/en/function.str-getcsv.php – evan

+0

Thanks Evan.This works我在回答部分提出了這個問題。 – Sitansu

1

我並不想成爲死靈在這一個,我沒有足夠的底氣來回答你的答案,但此行

$data[] = str_getcsv($buffer); 

應該讀

$data = str_getcsv($buffer); 

這對我有用。

1

我也遇到了同樣的問題,我用這種方法解決了它。

while (($data = fgetcsv($file, 0, "\t", '"', "\\")) !== FALSE) { 
    $val_arr = explode(",",$data[0]); 
    //here, you can get each column values from $val_arr  
    .... 
} 
4

我有同樣的問題,並解決它太容易。如果您的字符串外殼字符是'''(雙引號),並且您只是不想將反斜線視爲轉義字符,則只需通知雙引號兩次,如字符串enclusure和轉義字符

$data = fgetcsv($handle, 8192, ';' , '"' , '"' ); 
0

你好我的.csv爲\"",當我有一個類似的PB它會剝奪一些\"所以基於什麼Sitansu上面說我所做的:

if (($handle = fopen($input_csv, "r")) !== FALSE) 
{ 
    while (($buffer = fgets($handle)) !== false) 
    { 
     $buffer = str_replace('\""', '\\"', $buffer); 
     $row = str_getcsv($buffer); 

     // Do stuff on cells. 
    } 

    ... 
}