2013-11-01 23 views
0

我有一個處理CSV文件作爲輸入的模塊。它在我的Ubuntu機器上工作正常,直到我的團隊中有人開始使用Microsoft Excel創建csv。在PHP中處理能夠滿足MS和UNIX的CSV文件換行

因此,新輸入CSV上有^ M(\ r \ n)個字符,因此,我的代碼假定CSV僅包含1行,並且所有數據都已填充到$ he​​ader。

由於php.net建議以t模式打開文本,因此我已將讀取模式更改爲「rt」,但問題仍然存在。看起來rt只適用於Windows將\ n轉換爲\ rn 。

從PHP.NET:Windows下提供了一個文本轉換標記( 't')可以在文件上工作時,透明地將\ n轉換到用\ r \ n。相反,您也可以使用'b'強制執行二進制模式,這將不會轉換您的數據。要使用這些標誌,請指定'b'或't'作爲模式參數的最後一個字符。

有沒有什麼辦法可以接受這兩種換行(微軟和UNIX),最好只改變PHP代碼?我知道有dos2unix(從Ubuntu的fromdos)命令,但最新的Ubuntu沒有默認情況下,我想避免安裝其他實用程序。

下面是我當前的源代碼:

 $row = 1; 
     if (($handle = fopen($file, "r")) !== FALSE) 
     { 
      while (($data = fgetcsv($handle)) !== FALSE) 
      { 
       $num = count($data); 

       if($row == 1) 
       { 
        $header = $data; 
       }else 
       { 
        $rows[$row-1] = $data; 
       } 
       $row++; 
      } 
      fclose($handle); 
     } 
+0

是否有任何機會,它只能讀取一個好線,其次是傷了你的一個空行?我已經看到了Windows結尾和文件讀取器的效果。 –

+1

'ini_set('auto_detect_line_endings',true);' – Anthony

回答