免费注册 查看新帖 |

Chinaunix

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

[文本处理] 文本处理 [复制链接]

论坛徽章:
9
寅虎
日期:2013-12-02 12:49:22巨蟹座
日期:2014-07-18 18:13:34卯兔
日期:2014-07-25 14:43:08子鼠
日期:2014-07-26 10:10:51酉鸡
日期:2014-07-31 15:09:562015亚冠之本尤德科
日期:2015-05-19 09:27:382015亚冠之卡尔希纳萨夫
日期:2015-06-20 10:30:212015亚冠之阿尔纳斯尔
日期:2015-07-01 20:46:062015亚冠之城南
日期:2015-07-15 21:12:00
发表于 2016-11-02 14:20 |显示全部楼层
本帖最后由 lifayi2008 于 2016-11-02 14:26 编辑

文件1
  1. 河北省 石家庄市 市辖区
  2. 河北省 石家庄市 长安区
  3. 河北省 石家庄市 桥东区
  4. 河北省 石家庄市 桥西区
  5. 河北省 石家庄市 新华区
  6. 河北省 石家庄市 井陉矿区
  7. .............
  8. .............
  9. 河北省 衡水市 武邑县
  10. 河北省 衡水市 武强县
  11. 河北省 衡水市 饶阳县
  12. 河北省 衡水市 安平县
  13. 河北省 衡水市 故城县
  14. 河北省 衡水市 景 县
  15. 河北省 衡水市 阜城县
  16. 河北省 衡水市 冀州市
  17. ............
  18. 还有其他全国省市

复制代码
文件2
  1. 河北省
  2.         石家庄市
  3.             市辖区
  4.             井陉矿区
  5.             长安区
  6.             桥东区
  7.             桥西区
  8.             这个肯定不在
  9. .................
  10. .................
  11.         邯郸市
  12.             丛台区
  13.             复兴区
  14.             峰峰矿区
  15.             广平县
  16.             邱县
  17.             魏县
  18. ................
  19. 还有其他全国省市
复制代码

以 文件1 为正确信息    找出 文件2 中 县/区 不正确的

不正确包括: 县/区 不存在  或者  县/区 不在这个市


先谢谢各位

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-11-02 15:58 |显示全部楼层
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;

  5. binmode (STDOUT, ':encoding(utf8)');

  6. my %hData;
  7. open (my $FHr, '<:encoding(utf8)', shift);
  8. while (defined (local $_ = <$FHr>)){
  9.     my ($prov, $city, $dist) = split;
  10.     $hData{$prov}{$city}{$dist}++;
  11. }
  12. close ($FHr);

  13. open ($FHr, '<:encoding(utf8)', shift);
  14. my ($prov, $city);
  15. my $rgx = qr /[\x{4E00}-\x{9FA5}]+/;
  16. while (defined (local $_ = <$FHr>)){
  17.     if (/(${rgx}省)/){
  18.         $prov = $1;
  19.         next;
  20.     }
  21.     if (/(${rgx}市)/){
  22.         $city = $1;
  23.         next;
  24.     }
  25.     print join (",", $prov, $city, $1), "\n" if (/($rgx)/ xor exists $hData{$prov}{$city}{$1});
  26. }
  27. close ($FHr);
复制代码


cat a
----------------------------------------------------------------
河北省 石家庄市 市辖区
河北省 石家庄市 长安区
河北省 石家庄市 桥东区
河北省 石家庄市 桥西区
河北省 石家庄市 新华区
河北省 石家庄市 井陉矿区
河北省 衡水市 武邑县
河北省 衡水市 武强县
河北省 衡水市 饶阳县
河北省 衡水市 安平县
河北省 衡水市 故城县
河北省 衡水市 景 县
河北省 衡水市 阜城县
河北省 衡水市 冀州市

cat b
------------------------------------------
河北省
        石家庄市
            市辖区
            井陉矿区
            长安区
            桥东区
            桥西区
                        网线
        邯郸市
            丛台区
            复兴区
            峰峰矿区
            广平县
            邱县
            魏县

perl abc.pl a b
-------------------------------------------------
河北省,石家庄市,网线
河北省,邯郸市,丛台区
河北省,邯郸市,复兴区
河北省,邯郸市,峰峰矿区
河北省,邯郸市,广平县
河北省,邯郸市,邱县
河北省,邯郸市,魏县

论坛徽章:
9
寅虎
日期:2013-12-02 12:49:22巨蟹座
日期:2014-07-18 18:13:34卯兔
日期:2014-07-25 14:43:08子鼠
日期:2014-07-26 10:10:51酉鸡
日期:2014-07-31 15:09:562015亚冠之本尤德科
日期:2015-05-19 09:27:382015亚冠之卡尔希纳萨夫
日期:2015-06-20 10:30:212015亚冠之阿尔纳斯尔
日期:2015-07-01 20:46:062015亚冠之城南
日期:2015-07-15 21:12:00
发表于 2016-11-02 17:03 |显示全部楼层
回复 2# sunzhiguolu

tks   可以使用  就是perl不懂

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
发表于 2016-11-02 17:45 |显示全部楼层
  1. all = {}
  2. with open("a") as f:
  3.     for i in f:
  4.         tmp = i.strip().split()     
  5.         for j,k in enumerate(tmp[:-1]):
  6.             if "%*s%s" % (j*4, "", tmp[j].decode('utf-8')) not in all:
  7.                 print "%*s%s" % (j*4, "", tmp[j].decode('utf-8'))
  8.                 all["%*s%s" % (j*4, "", tmp[j].decode('utf-8'))] = None
  9.         print "%*s%s" % ((len(tmp)-1)*4," ", tmp[-1].decode('utf-8'))  
复制代码

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
发表于 2016-11-02 17:50 |显示全部楼层
  1. awk '{s=f;for(i=1;i<NF;i++){s=sprintf("%*s%s",(i-1)*4,"",$i);if(!(s in a)){print s;a[s]}}printf "%8s%s\n","",$NF}' a
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-11-02 18:17 |显示全部楼层
本帖最后由 sunzhiguolu 于 2016-11-02 21:29 编辑

回复 3# lifayi2008
意思弄错了.

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-11-02 18:22 |显示全部楼层
本帖最后由 sunzhiguolu 于 2016-11-02 21:30 编辑

意思弄错了.

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2016-11-02 22:30 |显示全部楼层
本帖最后由 moperyblue 于 2016-11-02 22:31 编辑

文件2
"市" 前面的缩进一致吗? 如 都是8个空格?
"区/县" 前面的缩进一致吗? 如 都是12个空格?

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2016-11-02 22:56 |显示全部楼层
回复 1# lifayi2008

$ awk --posix 'FNR==NR{a[$1,$2,$3]=a[$1,$2]=1;next}/^ {12}/{if(!a[s1,s2,$1])print s,c,$1;next}/^ {8}/{c=$1;if(!a[s,c])print s,c;next}{s=$1}' f1 f2
河北省 石家庄市 市辖区
河北省 石家庄市 这个肯定不在
河北省 邯郸市
河北省 邯郸市 丛台区
河北省 邯郸市 魏县



$ cat f2
河北省
        石家庄市
            市辖区
            这个肯定不在
        邯郸市
            丛台区
            魏县

论坛徽章:
9
寅虎
日期:2013-12-02 12:49:22巨蟹座
日期:2014-07-18 18:13:34卯兔
日期:2014-07-25 14:43:08子鼠
日期:2014-07-26 10:10:51酉鸡
日期:2014-07-31 15:09:562015亚冠之本尤德科
日期:2015-05-19 09:27:382015亚冠之卡尔希纳萨夫
日期:2015-06-20 10:30:212015亚冠之阿尔纳斯尔
日期:2015-07-01 20:46:062015亚冠之城南
日期:2015-07-15 21:12:00
发表于 2016-11-04 17:48 |显示全部楼层
回复 9# jason680

非常感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP