免费注册 查看新帖 |

Chinaunix

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

一个文本信息提取的困惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-09 20:10 |只看该作者 |倒序浏览
抽象出的文本内容:
start xxxxx
1 xxxxx
2 xxxxx
1 xxxxx
2 xxxxx
end xxxxx
start xxxxx
1 xxxxx
2 xxxxx
1 xxxxx
2 xxxxx
1 xxxxx
2 xxxxx
end xxxxx
start xxxxx
1 xxxxx
2 xxxxx
end xxxxx

现在要提取每一个start和end区间里的最后那行 "2 xxxxx" ?
笨办法是可以做到的,但太麻烦或消耗太大(原文件上G)了,想请教这里的高手们,如何简单高效实现?
先谢过了!!!

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2012-04-09 21:34 |只看该作者
回复 1# 潇湘君

  1. $ cat t.pl
  2. #!/usr/bin/perl

  3. use strict;
  4. use warnings;

  5. my $data;
  6. while (<DATA>) {
  7.         if (/^start/ .. /^end/) {
  8.                 $data = $_ if /^2/;
  9.                 print "$data" if /^end/;
  10.         }
  11. }

  12. __DATA__
  13. start xxxxx
  14. 1 xxxxx
  15. 2 xxxxx
  16. 1 xxxxx
  17. 2 xxxxxz
  18. end xxxxx
  19. start xxxxx
  20. 1 xxxxx
  21. 2 xxxxx
  22. 1 xxxxx
  23. 2 xxxxx
  24. 1 xxxxx
  25. 2 xxxxxz
  26. end xxxxx
  27. start xxxxx
  28. 1 xxxxx
  29. 2 xxxxxz
  30. end xxxxx

  31. $ ./t.pl
  32. 2 xxxxxz
  33. 2 xxxxxz
  34. 2 xxxxxz
复制代码

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2012-04-09 21:38 |只看该作者
回复 2# MMMIX


    當然,也完全可以不用 ..,不過如果你要針對每個 block 做些操作的話,.. 就很有用了。

论坛徽章:
0
4 [报告]
发表于 2012-04-09 22:14 |只看该作者
本帖最后由 kurri 于 2012-04-09 23:42 编辑

回复 2# MMMIX
请教一下  (/^start/ .. /^end/)  何解?
啊。。测试了一下知道了   以前没注意到这个用法~

   

论坛徽章:
0
5 [报告]
发表于 2012-04-09 22:43 |只看该作者
回复 2# MMMIX


    非常感谢!!!
    我本来想到应该使用范围操作符,但没想到要用一个变量存储需要的行。看来还要多多练习啊!

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2012-04-10 09:00 |只看该作者
潇湘君 发表于 2012-04-09 22:43
我本来想到应该使用范围操作符,但没想到要用一个变量存储需要的行。看来还要多多练习啊!


关键是要把思路理清楚:逐行读取,碰到以 end 开头的行就把最后一次以 2 开头的行输出。由于在读取之前并不知道下一行会是什么,所以要把前面碰到的以 2 开头的行保留下来以供后面使用。

论坛徽章:
0
7 [报告]
发表于 2012-04-10 10:14 |只看该作者
kurri 发表于 2012-04-09 22:14
回复 2# MMMIX
请教一下  (/^start/ .. /^end/)  何解?
啊。。测试了一下知道了   以前没注意到这个用 ...


同问。有知道的,共享下呀。{:3_189:}

论坛徽章:
0
8 [报告]
发表于 2012-04-10 10:26 |只看该作者
6楼的思路运算比较少,应该更高效!

论坛徽章:
0
9 [报告]
发表于 2012-04-10 10:53 |只看该作者
回复 7# leve1031


    perldoc perlop -> Range Operators
http://perldoc.perl.org/perlop.html#Range-Operators

论坛徽章:
0
10 [报告]
发表于 2012-04-10 19:03 |只看该作者
二楼把perl用的很灵活,之前还真没有想过这种匹配。受教了、
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP