免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: sammyjeep
打印 上一主题 下一主题

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

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
11 [报告]
发表于 2009-11-12 17:16 |只看该作者

回复 #10 sammyjeep 的帖子

就算是200列,应该也可以用正则实现吧,就是大括号的数字变一下,还有,分组也可以取好几个,当然,组号如果不能确定,或者取决于某组的数字结果,就有点麻烦了.

btw 字符串相等应该用 eq 吧

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
12 [报告]
发表于 2009-11-12 17:18 |只看该作者

回复 #8 linuxty 的帖子

太细节的东西不大去记,因为发现记了也记不住

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

回复 #11 ttcn_cu 的帖子

呵呵,因为具体的需求很长,没有详细说明。
而匹配的条件是可配置的,而用正则是表达式做配置项时可维护性比较差,在使用正则方式时要把读出的匹配条件做相应的转换,所以使用起来稍稍有点麻烦。

论坛徽章:
1
未羊
日期:2014-09-08 22:47:27
14 [报告]
发表于 2009-11-13 08:36 |只看该作者
原帖由 sammyjeep 于 2009-11-12 15:24 发表
#!/usr/bin/perl

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

我想判断第八个列是不是1,现在只能把整个字符串都split后使得 ...
  1. @list = (1, 2, 3, 4);              #在这里放入你需要的列号,从0开始计数的哦
  2. @F = (split /\|/, $line)[@list];
复制代码

不知道这样会不会快一点。就是把你需要的列放入数组@F中,然后自己处理。

[ 本帖最后由 wxlfh 于 2009-11-13 08:38 编辑 ]

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


如果最后3个字符一定是|1|的话,直接找就行了
$t="1111|2222|3333|4444|5555|6666|7777|1|"; -1 != index $t, "|1|", length( $t ) - 3

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
16 [报告]
发表于 2009-11-13 11:06 |只看该作者

回复 #15 orangetouch 的帖子

这个效率其实很差

论坛徽章:
0
17 [报告]
发表于 2009-11-13 11:20 |只看该作者
原帖由 flw 于 2009-11-13 11:06 发表
这个效率其实很差


呃……

我还是对比了一下才敢贴上来的,比split /\|/要快

不过好像这样会更快一点

$t=~/\|1\|$/

论坛徽章:
0
18 [报告]
发表于 2009-11-13 17:23 |只看该作者

回复 #14 wxlfh 的帖子

呵呵,多谢各位帮忙。
我两天的测试下来,已经有了初步的分析结果,性能的排序大概可以分为如下:
测试条件,文本文件约2000个,共45万行,每行有2百列,其中用到第77,81,85,89,93列,处理环境 Intel某64位处理器,型号不详;内置磁盘;8G内存;操作系统SLES10 SP01

1.ttcn_cu所的正则是表达式法,在到CU发贴前我也比较倾向的方法,处理时间约13秒,缺点是在复杂条件下不太灵活,作为配置项不易读,可维护性差。
2.@F=split(/\|/, $line, 94); 处理时间42秒,处理起来简单可把条件直接作为配置项在if中使用eval来使用。
3.wxlfh 所说的@F = (split /\|/, $line)[@list]; 处理时间42秒,和上一个方法基本一致,估计原理也差不多。
4.@F=split(/\|/, $line); 处理时间58秒,和2,3比较就可以知道分割字符多少对性能影响还是比较大的。

出于综合考虑可能会先用二来实现,后续改为用方法一。

我是从ksh+sed+awk转为使用perl的,后面还要多多请教啊,呵呵。

论坛徽章:
0
19 [报告]
发表于 2009-11-13 17:55 |只看该作者
还是正则牛啊

论坛徽章:
0
20 [报告]
发表于 2009-11-14 10:05 |只看该作者
原帖由 sammyjeep 于 2009-11-13 17:23 发表
呵呵,多谢各位帮忙。
我两天的测试下来,已经有了初步的分析结果,性能的排序大概可以分为如下:
测试条件,文本文件约2000个,共45万行,每行有2百列,其中用到第77,81,85,89,93列,处理环境 Intel某64位处 ...

正则居然比split快。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP