2010-08-09 63 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数据,他们是您最好的朋友。