LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 620|回复: 2

有没有什么方法能从某文件中提取我感兴趣的部分文本?

[复制链接]
发表于 2004-12-18 13:17:05 | 显示全部楼层 |阅读模式
我最近用apache+php+mysql搭建了一个学习php和mysql的环境,正好领导要我写一个小小的安全违章信息管理系统。数据库模式已经设计好,做到现在领导才提醒我以前的安全违章信息是用文件记录的。而我设计的违章信息表(vio-info)包含如下字段:
vio_id   bigint(20) //违章事件ID(主键)  
user_id   int(5) //违章者的ID
vio_name   varchar(20)   //违章者姓名
user_class   varchar(20) //违章者职务   
vio_depart   varchar(50) //违章者部门
vio_date   date         //违章日期
vio_reason   text       //违章原因
vio_class    char        //违章性质(一般,严重)
vio_punish   text        //违章处理结果
自己看那些文件,才发现没有“固定”的格式,例如:2004年12月1日在XX部门发现YY(职务)XXX员工违章,原因是.............,属于XX(违章性质)违章,经上级确定给予以下处罚..........(违章处理结果)。领导的意思如果人工提取这些信息并手工录入,好象失去了信息技术带来的高效,快捷。所以我考虑到将那些文件扫描后OCR成txt文件,然后用脚本提取这些信息再按照mysql数据表的要求存为带域分隔符的文本文件,最后导入数据库中。不知道perl或者unix系统自带的awk sed能否实现这样的功能,向各位请教!
发表于 2004-12-20 16:17:16 | 显示全部楼层
正则表达式即可
如果文本其它内容是固定的话
看看?[PHP]preg_match('/(.*?)在(.*?)部门发现(.*?)(职务)(.*?)员工违章,原因是(.*?),属于(.*?)违章,经上级确定给予以下处罚:\\n(.*?)/', $text, $cap);
print_r($cap);[/PHP]


唯一要求就是其它地方的格式固定,要不然,再高科技也没辙
 楼主| 发表于 2004-12-27 23:23:37 | 显示全部楼层
www.chinaunix.net
上bitbull兄给我的回复如下
http://bbs.chinaunix.net/forum/viewtopic.php?t=468943

  1. #!/bin/bash
  2. sed 's/\([0-9]*\)年\([0-9]*\)月\([0-9]*\)日在\(.*\)部门发现\(.*\)(职务)\(.*\)(姓名).*原因是\(.*\),属于\(.*\)(违章性质).*以下处罚\(.*\)(违章处理结果).*/\1\2\3;\4;\5;\6;\7;\8;\9/' $1>temp
  3. awk 'BEGIN { i=1 }
  4. {
  5.         print i";"i";"$0
  6.         i++
  7. }' temp  


  8. 测试如下
  9. 代码:
  10. [root@bbhome test]# cat file
  11. 2004年12月1日在ZZZ部门发现YYY(职务)XXX(姓名)员工违章,原因是AA,属于BB(违章性质)违章,经上级确定给予以下处罚CC(违章处理结果)。
  12. 2004年11月1日在销售部门发现经理(职务)武大狼(姓名)员工违章,原因是太急上厕所了,属于故意(违章性质)违章,经上级确定给予以下处罚开除(违章处理结果)。
  13. 2004年10月11日在开发部门发现技术主管(职务)武松(姓名)员工违章,原因是大嫂和别人睡觉,属于故意杀人(违章性质)违章,经上级确定给予以下处罚枪毙(违章处理结果)。
  14. 2004年12月1日在卫生部门发现小工(职务)西门庆(姓名)员工违章,原因是和别人老婆睡觉,属于故意(违章性质)违章,经上级确定给予以下处罚阉割(违章处理结果)。



  15. [root@bbhome test]# temp2 file
  16. 1;1;2004121;ZZZ;YYY;XXX;AA;BB;CC
  17. 2;2;2004111;销售;经理;武大狼;太急上厕所了;故意;开除
  18. 3;3;20041011;开发;技术主管;武松;大嫂和别人睡觉;故意杀人;枪毙
  19. 4;4;2004121;卫生;小工;西门庆;和别人老婆睡觉;故意;阉割

复制代码

请问这段代码的功能用perl如何实现,多谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表