免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1795 | 回复: 4
打印 上一主题 下一主题

模式匹配CVS记录的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-01 10:08 |只看该作者 |倒序浏览
$s = q(a,b,,"""d,d""");
my @arr1 = $s =~ /((?:"(?:[^"]|"")+")|(?:[^,])*)/g;
my @arr2 = $s =~ /((?:"(?:[^"]|"")+")|(?:[^,])+)/g;

上面3行代码中:
@arr1中,每个非空字段后多匹配一个空记录
@arr2中,b后面的空记录未能匹配。
请问如何才能匹配出正确的4字段?(不用TEXT::CSV_XS的情况下)
谢谢!

论坛徽章:
27
水瓶座
日期:2014-08-22 21:06:34程序设计版块每日发帖之星
日期:2015-11-25 06:20:0015-16赛季CBA联赛之新疆
日期:2015-12-19 19:05:48IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:3315-16赛季CBA联赛之上海
日期:2016-04-15 19:51:31程序设计版块每日发帖之星
日期:2016-04-17 06:23:29程序设计版块每日发帖之星
日期:2016-04-23 06:20:00程序设计版块每日发帖之星
日期:2016-05-26 06:20:00每日论坛发贴之星
日期:2016-05-26 06:20:0015-16赛季CBA联赛之辽宁
日期:2017-02-16 23:59:47
2 [报告]
发表于 2009-03-01 19:15 |只看该作者
$s = q(a,b,,"""d,d""");
my @arr1 = $s =~ /((?:"(?:[^"]|"")+")|(?:[^,])*)/g;
my @arr2 = $s =~ /((?:"
(?:[^"]|"")+")|(?:[^,])+)/g;
print "@arr1"."n";
print @arr2;

F:>perl 1.pl
a b """d,d"""
ab"""d,d"""
F:>
如何才能匹配出正确的4字段?
打印出是这个样子啊,怎么4字段,5吧.就是,为分隔符不?
split可以不?
$s = q(a,b,,"""d,d""");
@arr=split(/,/,$s);
print "n"."@arr";

a b """d d"""


[ 本帖最后由 shijiang1130 于 2009-3-1 19:20 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-03-03 11:16 |只看该作者
$s = q(a,2,,"""d,d""");
my @arr1 = $s =~ /((?:"(?:[^"]|"")+")|(?:[^,])*)/g;
my @arr2 = $s =~ /((?:"(?:[^"]|"")+")|(?:[^,])+)/g;

print "------------arr1-----------\n";
print "[$_]\n" for (@arr1);
print "------------arr2-----------\n";
print "[$_]\n" for (@arr2);
print "---------------------------\n";
结果:
------------arr1-----------
[a]
[]
[2]
[]
[]
["""d,d"""]
[]
------------arr2-----------
[a]
[2]
["""d,d"""]
---------------------------
split肯定不行:["""d,d"""]作为一个整体,如用split,将把其分成两部份。想要的结果应为:
[a]
[2]
[]
["""d,d"""]
问题是: 怎样才能等到上面的结果?

最后一个字段["""d,d"""]改为["d,d"]可能好理解点,即字段中含有字段分隔符","时,将用双引号引起,
若字段中有双引号,将用连在一起的两个双引号表示原来的每个引号
扣![字符b] 不能显示,改"2"

[ 本帖最后由 wwwjy2000 于 2009-3-3 14:52 编辑 ]

论坛徽章:
27
水瓶座
日期:2014-08-22 21:06:34程序设计版块每日发帖之星
日期:2015-11-25 06:20:0015-16赛季CBA联赛之新疆
日期:2015-12-19 19:05:48IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:3315-16赛季CBA联赛之上海
日期:2016-04-15 19:51:31程序设计版块每日发帖之星
日期:2016-04-17 06:23:29程序设计版块每日发帖之星
日期:2016-04-23 06:20:00程序设计版块每日发帖之星
日期:2016-05-26 06:20:00每日论坛发贴之星
日期:2016-05-26 06:20:0015-16赛季CBA联赛之辽宁
日期:2017-02-16 23:59:47
4 [报告]
发表于 2009-03-03 20:53 |只看该作者
$s = q(a,b,,"""d,d""");
($x,$y,$z,@o)=split(/,/,$s);
print "\n"."$x";
print "\n"."$y";
print "\n"."$z";
print "\n"."@o";

论坛徽章:
0
5 [报告]
发表于 2009-03-03 21:55 |只看该作者
split不可行!
因为含有","的字段不一定固定在第4字段的。楼上的老兄的方案仅适用于给出的例子
不具通用性
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP