2011-11-03 59 views
6

我正在寫一個函數來處理CSV輸出使用fputcsv()。我已經解決了很多人與fputcsv()(見代碼)有關的可怕\r\n問題。創建CSV文件時,如何處理字段中的 n和 r字符?

現在我試圖弄清楚如何處理\r\n包含在字段中的字符(而不是行結尾返回\r\n)。它應該在被傳入fputcsv()之前以某種方式逃脫?

該函數可以很好地處理大多數字符。但是,如果將\n插入字段中,則MS Excel和Google文檔在\n上存在問題,並且CSV無法正確加載。

/* 
* Revised Get CSV Line using PHP's fputcsv() 
* 
* Used to correct an issue with fputcsv() 
* http://stackoverflow.com/questions/4080456/fputcsv-and-newline-codes 
* MS Excel needs the MS Windows newline format of \r\n 
* 
*/ 

if (!function_exists('get_csv_line')) 
{ 
    function get_csv_line($list, $seperator = ",", $enclosure = '"', $newline = "\r\n") 
    { 
     $fp = fopen('php://temp', 'r+'); 

     fputcsv($fp, $list, $seperator, $enclosure); 
     rewind($fp); 

     $line = fgets($fp); 
     if ($newline && $newline != "\n") { 
      if ($line[strlen($line)-2] != "\r" && $line[strlen($line)-1] == "\n") { 
       $line = substr_replace($line,"",-1) . $newline; 
      } else { 
       die('original csv line is already \r\n style'); 
      } 
     } 
     if ($newline == "\r\n" && substr($line, -2) != "\r\n") { 
      log_message('error', 'function get_csv_line: Error, needs \r\n to be MS Excel friendly!'); 
     } 
     return $line; 
    } 
} 
+0

我應該用空格替換字段中的\ n和\ r嗎? – jjwdesign

+3

相關問題:[爲CSV生成CSV文件,如何在一個值內有一個換行符?](http://stackoverflow.com/questions/1241220/generating-csv-file-for-excel-how-to-have- a-newline-value-value) – Anne

+0

我之前就曾經做過類似的事情,CSV是一件可怕的事情,你甚至可能會遇到包含你的圈套或分離符號的字段等問題。我最終不得不爲這些符號選擇一些外來語言字符,並運行一個非常長的腳本來檢查這些符號,並確保有足夠的外殼和分隔字符。 –

回答

3

如果有\領域內的R或\ n只要確保整場用雙引號(和字面雙引號是雙電雙引號)

所以對於最終結果的

value1,"so this is a 
multiline value",value2 

其中「一」和「多」被或\ n或\ r分開(記住,\ r不會出現在Excel中,但它的存在),那麼它應該有工作。

如果\ n或\ r值嵌入您在PHP數組中的值中,那麼它應該已經被適當地包含。

0

包含BOM的UTF文件將導致Excel直接處理新行,即使該字段被引號包圍。 (經過測試的Excel 2008 Mac)

解決方法是使任何新行回車(CHR 13)而不是換行。

相關問題