免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3508 | 回复: 11

求帮忙解析文本处理!!! [复制链接]

论坛徽章:
0
发表于 2015-08-13 11:33 |显示全部楼层
现在我有一个文本1.txt
内容如下
#begincase aaaaaa
<?xml version?>
<result="pass">pass</result>
#endcase
#begincase bbbbb
<?xml version?>
<result="fail">fail</result>
#endcase
#begincase cccccc
....
...

现在我要取出begincase后面的字符和对应的result
求帮忙!!!在线等!!!

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
发表于 2015-08-13 13:57 |显示全部楼层
aaaaaa => pass,
cccccc => fail,
bbbbb => fail


  1. my %dict;
  2. my $key;

  3. while (<DATA>) {
  4.     if (/^#begincase\s+(\S+)/) { $key = $1 }
  5.     elsif (/^<result="(\S+)"/) { $dict{$key} = $1 }
  6. }

  7. __DATA__
  8. #begincase aaaaaa
  9. <?xml version?>
  10. <result="pass">pass</result>
  11. #endcase
  12. #begincase bbbbb
  13. <?xml version?>
  14. <result="fail">fail</result>
  15. #endcase
  16. #begincase cccccc
  17. <?xml version?>
  18. <result="fail">fail</result>
  19. #endcase
复制代码

论坛徽章:
0
发表于 2015-08-13 14:42 |显示全部楼层
这是基本的正则问题吧

论坛徽章:
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
发表于 2015-08-13 14:57 |显示全部楼层
回复 2# substr函数


    这种做法容易漏掉某些里面没有 result 的 case.

像这种头尾都很规则的块, 用 range operator .. 是最方便的了.

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
发表于 2015-08-13 16:11 |显示全部楼层
回复 4# MMMIX

赞一个!

论坛徽章:
1
双子座
日期:2013-11-06 17:18:01
发表于 2015-08-13 16:29 |显示全部楼层
MMMIX 发表于 2015-08-13 14:57
回复 2# substr函数


试一下

  1. while(<DATA>){
  2. if(/begincase/../result/)
  3. {
  4.         if((/^#begincase\s+(\S+)/) || (/^<result="(\S+)"/)){
  5.         print "$1\n";
  6. }}

  7. }

  8. __DATA__

  9. #begincase aaaaaa
  10. <?xml version?>
  11. <result="pass">pass</result>
  12. #endcase
  13. #begincase bbbbb
  14. <?xml version?>
  15. <result="fail">fail</result>
  16. #endcase
  17. #begincase cccccc
  18. <?xml version?>
  19. <result="fail">fail</result>
  20. #endcase

复制代码

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2015-08-13 16:46 |显示全部楼层
我花了好久才明白这个flip flop 操作符(scalar context 下的 ..)到底干了什么,不擅长shell的用个变量保存状态就好了,至少能节省你五个小时生命

论坛徽章:
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
发表于 2015-08-13 17:24 |显示全部楼层
本帖最后由 MMMIX 于 2015-08-13 17:26 编辑

回复 7# zhlong8


    就是有个隐藏状态嘛. 这在 Perl 中是很常见的, 每个 hash 都有个内部的 iterator, regex 中的 /c 和 \G, filehandle 内部的 file position, 等等.

论坛徽章:
0
发表于 2015-08-14 15:15 |显示全部楼层
#!usr/bin/perl -w
use strict;

local $/="#endcase\n";
while(<DATA>){
        chomp;
        print $1."\t".$2."\n" if (/^#begincase (\w+)\n<.*>\n<.*>(\w+)/);

}

__DATA__
#begincase aaaaaa
<?xml version?>
<result="pass">pass</result>
#endcase
#begincase bbbbb
<?xml version?>
<result="fail">fail</result>
#endcase
#begincase cccccc
<?xml version?>
<result="pass">pass</result

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2015-08-18 04:40 |显示全部楼层
每天处理各种各样的数据,大多数都是不规范的各种数据,要自己制作数据解析器,如果是固定的 Json 格式,Yaml 格式,或者和数据生成的人商量一下,约定一种数据结构,就会省却大量的时间。但大多数情况下,这些都不可能实现。

用语法描述数据格式,制作一个数据解析器,只要加载不同的语法,就能解析不同的数据,因为对语法的抽象,很多数据可以是使用同一个语法描述规则,这样就大大增加代码的可复用性。

例如上面的数据,就是加了注释的 XML, 可以临时设计一个新的语法,简单重载 XML 的语法:
  1. use Grammar::XML;

  2. grammar XML-with-comment {
  3.    
  4.     also is Grammar::XML;
  5.     token TOP { ^ [ <comment> || <XML> ]+ $ }
  6.     token comment { '#' .*? $ }
  7. }
复制代码
这样就能直接解析数据了:
  1. my $parse-file = 'xxx.file';
  2. my $data = XML-with-comment.parse-file($parse-file);
复制代码
接下来的就是遍历这个数据结构,找到其中的 key 为 comment 和 result 的数据结构,提取出来,想怎么组合都行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP