使用分隔符解析CSV中带引号的字符串CSV文件
我有一个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
问题正是为什么创建模块,如Text::CSV
。如果,但只有在数据没有嵌入逗号的情况下,才可以使正则表达式起作用。当数据嵌入逗号时,是时候转移到一个专用于处理带有嵌入逗号的CSV的工具,并且这将是Perl中的Text::CSV
(及其亲属Text::CSV_PP
和Text::CSV_XS
)。
我需要使用Text :: CSV_PP或Text :: CSV_XS?有什么不同?它会在perl上运行,为sun4-solaris-64-ld构建的v5.8.7 – Arav 2012-03-23 06:32:06
您可以使用并安装'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
非常感谢信息 – Arav 2012-03-27 03:11:40
我也使用了与您的方法相同的方法,它适用于我。试试这个代码。
my @values = split(/(?<="),(?=")/, $line);
希望它有助于
你的问题引出了一个问题 - 为什么不使用(例如)在['文本:: CSV'(http://search.cpan.org/~makamaka/Text- CSV-1.21/lib/Text/CSV.pm)模块,它可以为你处理这种问题? – 2012-03-23 04:58:54
所有程序员都应该学习的一节课:切勿自行解析CSV或HTML。使用现有的模块,它们通常是成熟的,稳定的并且经过良好测试。 – dgw 2012-03-23 10:25:11