使用正则表达式在CSV文件中分割()值

时间:2011-05-30 13:51:20

标签: php regex csv split

我有一个我正在解析的CSV文件。

我使用split()按逗号分隔列。

问题在于它是在字段中拆分包含逗号的列。

解决方案是在分割中使用正则表达式来忽略逗号后面的空格(EG:“,”),并且只分割没有尾随空格的逗号(EG:“,”)。

现在我的分裂看起来像这样:

$div = ',';
split('$div',$line);

我如何修改我的split()调用?

4 个答案:

答案 0 :(得分:2)

使用PHP解析完整有效的CSV文件,您只需:

$data = array_map("str_getcsv", file($fn));

但是如果你的文件格式真的不一致,那么你确实需要手动拆分方法和更具体的正则表达式。

preg_split('/,(?!\s)/', $line)

可以用来匹配没有空格的commans的正则表达式。请注意,您需要使用PCRE库中的preg_split,而不是旧的split来电。

答案 1 :(得分:1)

CSV文件的字段(特别是如果字段中包含逗号)应该用引号括起来:

 "A","B1,B2","C","D"

如果不是,那么这种歧义是你的第一个问题:

 A,B1,B2,C,D

有五个字段,你无能为力 1

如果您对源数据进行了整理,请使用fgetcsv进行解析。


1 如果确实如此:

  

解决方案是在分割中使用正则表达式来忽略逗号后面的空格(EG:“,”),并且只分割没有尾随空格的逗号(EG:“,”)。

所有“内部”逗号后面都有空格,然后您可以运行预处理步骤,将所有,<space>替换为\,。在CSV中转义逗号可以解决歧义:

A,B1\,B2,C,D

答案 2 :(得分:0)

  

我有一个我正在解析的CSV文件。

你正在重新发明轮子:PHP有很好的方法来实现这一点,即fgetcsv

if (($handle = fopen("test.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
        echo "<p> $num fields in line $row: <br /></p>\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        }
    }
    fclose($handle);
}

答案 3 :(得分:0)

始终将它们用作字符串。像这样

$outstr .='"'.$line->linename.'",';