免费注册 查看新帖 |

Chinaunix

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

请没有方法替换该死的split^_^ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-12 15:09 |只看该作者 |倒序浏览
写了一段处理文本代码,把文件中满足条件的记录取出来,现在的处理能力是45万条记录/每分钟。无法再优化了,在定位的过程中发现目前的瓶颈在split。大约60%左右的时间都在处理split(/\|/, $line);,目前成为瓶颈。

需求:判断一行中某几列值为特定值。有没有方法,不使用split就取出指定的列?

论坛徽章:
0
2 [报告]
发表于 2009-11-12 15:13 |只看该作者
问问题你也得给个样本啊,让大家自己猜吗??

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2009-11-12 15:18 |只看该作者
我这里是好的。

split 确实可以优化,perldoc -f split

论坛徽章:
0
4 [报告]
发表于 2009-11-12 15:24 |只看该作者

回复 #2 cobrawgl 的帖子

#!/usr/bin/perl

$line="1111|2222|3333|4444|5555|6666|7777|1|";
@F=split(/\|/, $line);
if ($F[7]=="1")
{
    print "$line\n";
}

我想判断第八个列是不是1,现在只能把整个字符串都split后使得$F[7]。有没有别的方法可以直接取到第八个字段。

论坛徽章:
0
5 [报告]
发表于 2009-11-12 15:29 |只看该作者

回复 #3 flw 的帖子

嗯,呵呵,我也正在看这个文档,不过从我自己测试的结果貌似分割的字段越多性能就越差,感觉最简单的方法是指定limit参数,性能会就改善。

论坛徽章:
0
6 [报告]
发表于 2009-11-12 15:48 |只看该作者
用 re 呢

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
7 [报告]
发表于 2009-11-12 15:59 |只看该作者
试试正则呢?
     1 #!/usr/bin/perl -w
      2 $line="1111|2222|3333|4444|5555|6666|7777|1|";
      3 $line=~/([^\|]+\|){7}([^\|]+)/;
      4 if ($2 eq "1")
      5 {
      6     print "$line\n";
      7 }

论坛徽章:
0
8 [报告]
发表于 2009-11-12 16:08 |只看该作者

回复 #7 ttcn_cu 的帖子

[^\|]  这里面不用加 \ 转义了吧

论坛徽章:
0
9 [报告]
发表于 2009-11-12 16:13 |只看该作者

回复 #7 ttcn_cu 的帖子

我的样例是个比较简单的,真实应用的时候使用有大约200列。要同时判断几个条件,用正则表达式就有点-_-,呵呵

论坛徽章:
0
10 [报告]
发表于 2009-11-12 16:15 |只看该作者

回复 #7 ttcn_cu 的帖子

还是谢谢了啊~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP