2010-08-09 61 views
1

我想寫一個正則表達式,它可以讓我解析excel創建的CSV文件。我注意到,當你從excel中導出一個CSV文件時,如果這個字段是一個字符串,它會將它封裝在引號中。如果該字符串本身包含引號,則它會用引號將每個引號轉義出來!匹配不在引號內的逗號

我想要做的是將我解析爲字段的每一行進行分割。鑑於上述情況,當有逗號不在引號內時,我必須分割。我的正則表達式很糟糕,那麼我該怎麼做呢?

我可以用逗號分開,但是我怎麼說當它不在引號之間?

$lines = file($toce_path); 

foreach ($lines as $line) { 

    $line_array = preg_split("/,/", $line); 

    $test = "($line_array[0], $line_array[1], $line_array[2])"; 

    echo $test.'<br />'; 

} 

This question與我的完全一樣,但它不適用於preg_split。 Preg_split需要與Perl兼容的正則表達式語法。

感謝所有的幫助

+1

是否可以使用正確的CSV分析器? – 2010-08-09 14:29:57

+1

另一個問題的正則表達式似乎與Perl兼容。如果它不起作用,我會感到驚訝。 – 2010-08-09 14:32:00

+0

@mmyers - 我不確定哪些是可用的?我曾嘗試在PHP中查找某些內容,但是我讀了一些評論,指出fgetcsv不適用於由excel創建的CSV。但是我對此非常接近,在正則表達式中我只是沒有希望。 – Abs 2010-08-09 14:33:56

回答

0

這種表達可與.NET,這應該是Perl兼容:(?<!\"\w*),

輸入:some, "text, here"僅返回上some逗號後的比賽。

+1

這也將拆分爲多個單詞,在這裏「」,但「」不會「分割,在這裏。有很多方法可以欺騙正則表達式來查找引號之間的令牌,但恐怕這不是一個好的方法。 – Kobi 2010-08-09 16:53:26

4

不完全回答你的問題,但也許解決您的問題:

你試過fgetcsv()str_getcsv()

如果您處理CSV數據,他們是您最好的朋友。