2010-02-23 54 views
12

我試圖通過PHP解析用戶上傳的CSV文件,但它無法正常工作。不帶引號的CSV不能與fgetcsv一起使用

我已經上傳了幾個格式正確的CSV並且工作正常,但是;我有很多用戶試圖導入從Excel導出的CSV文件,他們遇到問題。我將這些文件與我的文件進行了比較,並注意到Excel文件都缺少條目的引號。除此之外,它們是相同的。如果我打開它並使用Open Office保存它,但不進行任何更改。所以我很確定它與報價有關。

我的問題是;我如何閱讀這些格式不正確的CSV?

更新:原因已找到!

這是特定於Mac版本的Excel。由於某些原因,換行符在Mac上的處理方式不同,因此在使用fgetcsv之前,應該這樣做;

ini_set('auto_detect_line_endings',TRUE); 
+0

你能告訴我們你的代碼並告訴我們問題是什麼嗎?無論格式如何,我們都可以使用fgetcsv()而不會造成任何問題。 – jasonbar

+0

感謝這個傢伙!救生員 –

回答

22

這是特定於Mac版本的Excel。由於某些原因,換行符在Mac上的處理方式不同,因此在使用fgetcsv之前,應該這樣做;

ini_set('auto_detect_line_endings',TRUE); 
+0

謝謝!完美的作品。 – tbradley22

+0

令人F目結舌。真棒。找。 – Stegrex

1

望着manual page of fgetcsv,它的原型是這樣的:

array fgetcsv (resource $handle [, int $length 
    [, string $delimiter = ',' [, string $enclosure = '"' 
    [, string $escape = '\\' ]]]]) 

$enclosure(即第4個參數)默認值是一個雙引號。

如果您嘗試指定不需要任何存儲模塊,那麼爲第四個參數指定一個空字符串會怎樣?

(當然,這可能會破壞現在正在工作 - 這意味着您必須處理兩個不同的情況:帶有用雙引號括起來的字段的文件以及第一個無法讀取的文件案例)

+0

是的,我看到了。但是,正如你所說,它打破了目前的工作。有沒有簡單的方法來檢查它存儲在哪種格式並適當地切換行爲? –

+0

我想有一些正則表達式可以讓你確定一個文件在哪一種格式;另一種解決方案是總是嘗試第一個*(最常見的情況下)*解決方案,如果它不起作用,請嘗試第二個解決方案。考慮到你的文件中的所有行都可能以相同的方式進行格式化,只做第一行的測試應該足夠了 - 這意味着你只會對'fgetcsv'進行1次「無用」調用。 –

+0

我試過了,原來空白的外殼不起作用... –