我正在尝试获取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
任何人都可以帮我开发正则表达式来正确分割这个数组吗?基本上,如果项目以引号("
)开头,则需要等到","
分割。如果项目不以引号开头,则需要等到,
分割。
答案 0 :(得分:5)
尝试阅读Text::CSV作为已经执行此操作的可能选项。将CSV解析为正则表达式的问题在于,您必须查找","
(您指出的)以及,
分隔等内容。
答案 1 :(得分:5)
只需使用Text::CSV_XS代替......
答案 2 :(得分:-1)
有关详细信息,请参阅我的post that solves this problem。
^(?:(?:"((?:""|[^"])+)"|([^,]*))(?:$|,))+$
将匹配整行,然后您可以使用匹配的捕获来获取数据(不带引号)。