2013-01-10 30 views
3

我想讓fgetcsv()讀取一個逗號分隔值文件。通常這會按預期工作,但是我遇到了一個文件,其中一些列被拆分爲新的數據行而不是被視爲一個。fgetcsv在奇數位置拆分列

這裏是一個行給我找麻煩的例子: pastie.org/5664800

是創造該問題的列是一個與多條線路構成的說明。

fgetcsv結束第一讀取,當它到達下面一行:

- Length/Width/Height: 3.75\""x2.4\""x2.4\"" (95.25X60.96x60.96) 

因此,舉例來說,如果我有代碼:

ini_set('auto_detect_line_endings', true); 

while ($row = fgetcsv($filepointer, 5000, ',', '"') { 
    echo '<pre>'; var_dump($row); echo '</pre><br />'; 
} 

我得到的數據末端的一個大多完整的行在「Length/Width/Height: 3.75\"x2.4\""x2.4\"" (95.25X60.96x60.96)」中,然後每個換行符被視爲自己的行一直到結尾。

任何想法這裏發生了什麼?

+0

奇怪。 [適用於我。](http://ideone.com/wlaIGU)什麼是您的PHP版本? –

+0

這很奇怪。它是PHP 5.3.16。 – eComEvo

+0

嗯。它適用於我的電腦上的PHP 5.3.10,以及IDEone的5.2.12。爲了確保,你能否從IDEone下載我的測試腳本並檢查它是否失敗了? –

回答

5

的問題是,您的數據中包含的字符序列\""內發生難逃「圈地角色。從上下文,很明顯,這是應該來表示文字串\";也就是說,blackslash應該是一個反斜槓,而雙引號已經被加倍逃跑了

但默認情況下,fgetcsv()將反斜槓作爲轉義字符,所以它解析字符rs \"作爲反斜線轉義字面雙引號,然後假定第二個"結束雙引號字符串。

只要您使用PHP 5.3.0或更高版本,修正很簡單:只要告知fgetcsv()不要將反斜槓作爲第五個參數傳遞給轉義字符。顯然,通過nullfalse''將無法​​正常工作完全禁用轉義字符,但經過'"'(即相同的值引號字符)作用:

while ($row = fgetcsv($filepointer, 0, ',', '"', '"')) { 
    var_export($row); 
    echo "\n"; 
} 
+0

非常棒!非常感謝!這實際上解決了整個問題的連鎖反應:D – eComEvo

+0

這是一個很棒的信息!!我確定它會節省很多其他。謝謝!! – ekerner

+1

現在我們只需要fputcsv的相同參數,以便我們實際上可以實現符合RFC的CSV ... –

0

第五個參數fgetcsv()是如何當它封閉的字符串

+0

問題在於「'」字符在他的數據中似乎沒有任何轉義。 – Sammitch

+1

@Sammitch雙引號可以通過加倍的方式逃脫,如「」 – eComEvo