2012-03-23 125 views
0

我有一个CSV文件,格式如下,我使用的是基于逗号作为分隔符的Perl split命令。问题是我有一个嵌入逗号的引用字符串"HTTP Large, GMS, ZMS: Large Files",它失败。数组值只有更少的元素。我如何修改split命令。像嵌入的逗号使用分隔符解析CSV中带引号的字符串CSV文件

my @values = split('\,', $line); 

CSV文件

10852,800 Mob to Int'l,235341739,573047,84475.40,0.0003,Inbound,Ber unit 
10880,"HTTP Large, GMS, ZMS: Large Files",52852810,128,13712.68,0.0002,,Rer unit 
13506,Presence National,2716766818,2447643,309116.40,0.0001,Presence,per Cnit 
+6

你的问题引出了一个问题 - 为什么不使用(例如)在['文本:: CSV'(http://search.cpan.org/~makamaka/Text- CSV-1.21/lib/Text/CSV.pm)模块,它可以为你处理这种问题? – 2012-03-23 04:58:54

+2

所有程序员都应该学习的一节课:切勿自行解析CSV或HTML。使用现有的模块,它们通常是成熟的,稳定的并且经过良好测试。 – dgw 2012-03-23 10:25:11

回答

4

问题正是为什么创建模块,如Text::CSV。如果,但只有在数据没有嵌入逗号的情况下,才可以使正则表达式起作用。当数据嵌入逗号时,是时候转移到一个专用于处理带有嵌入逗号的CSV的工具,并且这将是Perl中的Text::CSV(及其亲属Text::CSV_PPText::CSV_XS)。

+0

我需要使用Text :: CSV_PP或Text :: CSV_XS?有什么不同?它会在perl上运行,为sun4-solaris-64-ld构建的v5.8.7 – Arav 2012-03-23 06:32:06

+1

您可以使用并安装'Text :: CSV';它带有纯粹的Perl实现'Text :: CSV_PP'('_PP'后缀表示'纯Perl',不需要C编译器)。然后为了最大限度地发挥系统的性能,您安装了'Text :: CSV_XS',它使用Perl扩展机制和C代码函数来实现相同代码的更高版本。自从有了Perl 5.8之前,'Text :: CSV'就已经出现了。它可以在5.8.7下正常工作。不过,目前的维护者首次发布的版本是在2007年。 (通过我的私人档案进行搜索,我从1997年7月发现了Text-CSV-0.01.tar.gz。) – 2012-03-23 06:45:36

+0

非常感谢信息 – Arav 2012-03-27 03:11:40

0

我也使用了与您的方法相同的方法,它适用于我。试试这个代码。

my @values = split(/(?<="),(?=")/, $line); 

希望它有助于

+1

您的代码违反了OP的数据,在此:'1234'你的文件中有嵌入式的“”,“”,“它会中断吗?”如果你只是使用“Text :: CSV”模块,你知道它会返回正确的文件。 – 2012-03-23 13:38:33

+0

非常感谢信息 – Arav 2012-03-27 03:12:24

+0

@ Ven'Tatsu我明白了你的观点,但我只是根据他的例子和代码提出了我的选择。根据他分裂的问题进行更正。 – quinekxi 2012-04-03 09:36:45

相关问题