简单的perl split()和正则表达式问题

时间:2011-06-22 02:10:07

标签: regex arrays perl split

  

可能重复:
  How can I parse quoted CSV in Perl with a regex?

我正在尝试获取CSV文件并将每行导入数组(其中每个元素代表一列)。 CSV文件的格式非常简单:

item1,item2,item3
nextrowitem1,item2,item3
"items,with,commas","are,in,quotes"

我使用以下方法导入了CSV文件:

open(FILE, "test.csv");
@lines = <FILE>;

然后我使用:

循环使用它
foreach(@lines){
    @items = split(/regular expression/);
    /*Do stuff with @items array*/
}

(请注意,您不需要使用split(/regular expression, $string);,因为如果没有提供字符串,split()会假定$_

在我使用CSV文件测试文件之前,其中没有任何项目包含逗号和split(/,/)的简单正则表达式。这工作得很好,所以在这个正则表达式之后,文件,读取它或我的循环没有任何问题。然而,当我点击包含逗号的项目时,他们可以理解地分为:

1 => "items
2 => with
3 => commas"
4 => "are
5 => in
6 => quotes"

取代期望的:

1 => items,with,commas
2 => are,in,quotes

任何人都可以帮我开发正则表达式来正确分割这个数组吗?基本上,如果项目以引号(")开头,则需要等到","分割。如果项目不以引号开头,则需要等到,分割。

3 个答案:

答案 0 :(得分:5)

尝试阅读Text::CSV作为已经执行此操作的可能选项。将CSV解析为正则表达式的问题在于,您必须查找","(您指出的)以及,分隔等内容。

答案 1 :(得分:5)

只需使用Text::CSV_XS代替......

答案 2 :(得分:-1)

有关详细信息,请参阅我的post that solves this problem

^(?:(?:"((?:""|[^"])+)"|([^,]*))(?:$|,))+$将匹配整行,然后您可以使用匹配的捕获来获取数据(不带引号)。