我有一個處理CSV文件作爲輸入的模塊。它在我的Ubuntu機器上工作正常,直到我的團隊中有人開始使用Microsoft Excel創建csv。在PHP中處理能夠滿足MS和UNIX的CSV文件換行
因此,新輸入CSV上有^ M(\ r \ n)個字符,因此,我的代碼假定CSV僅包含1行,並且所有數據都已填充到$ header。
由於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);
}
是否有任何機會,它只能讀取一個好線,其次是傷了你的一個空行?我已經看到了Windows結尾和文件讀取器的效果。 –
'ini_set('auto_detect_line_endings',true);' – Anthony