免费注册 查看新帖 |

Chinaunix

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

[文本处理] 第一列或第二列相同的行合并 [复制链接]

论坛徽章:
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
11 [报告]
发表于 2016-07-16 11:00 |只看该作者
本帖最后由 sunzhiguolu 于 2016-07-16 11:24 编辑

回复 7# mswsg
试下,

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my ($offset, @aData, %hMap) = 0;
  5. while (<DATA>){
  6.     my @aLine = split;
  7.     if (!@aData){
  8.         $aData[$offset] = [@aLine];
  9.         $hMap{$_} = $offset for @aLine;
  10.         next;
  11.     }
  12.     my @aPos;
  13.     if (@aPos = map {exists $hMap{$_} ? $hMap{$_} : ()} @aLine){
  14.         if (@aPos == 2 and $aPos[0] ne $aPos[-1]){
  15.             @aPos = @aPos[-1, 0] if ($aPos[0] > $aPos[-1]);
  16.             push (@{$aData[$aPos[0]]}, map {$hMap{$_} == $aPos[0] ? () : do {$hMap{$_} = $aPos[0]; $_}} @aLine);
  17.             push (@{$aData[$aPos[0]]}, map {$hMap{$_} == $aPos[0] ? () : do {$hMap{$_} = $aPos[0]; $_}} @{$aData[$aPos[-1]]});
  18.             splice (@aData, $aPos[-1], 1);
  19.             next;
  20.         }
  21.         push (@{$aData[$aPos[-1]]}, map {exists $hMap{$_} ? () : do {$hMap{$_} = $aPos[-1]; $_}} @aLine);
  22.         next;
  23.     }
  24.     $aData[++$offset] = [@aLine];
  25.     $hMap{$_} = $offset for @aLine;
  26. }

  27. print "@$_\n" for @aData;
  28. __DATA__
  29. A B
  30. C A
  31. D C
  32. E F
  33. N G
  34. C N
复制代码
perl abc.pl
--------------------------------
A B C D N G
E F


   

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
12 [报告]
发表于 2016-07-16 13:37 |只看该作者
$> cat aa|perl -01npe ' s/ //g; 1 while (s/(\w)(.*)\n+(\w*\1\w*)\n/\3\2\n/sg)'
DCNGAB
EF

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-14 06:20:00每日论坛发贴之星
日期:2015-10-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-08 06:20:00
13 [报告]
发表于 2016-07-18 23:00 |只看该作者
  1. char2id = {}
  2. id2charset = {}

  3. def getcharset(c):
  4.     try:
  5.         return id2charset[char2id[c]]
  6.     except:
  7.         return None

  8. def newcharset(chars):
  9.     newset = set(chars)
  10.     return newset

  11. def merge(charset1, charset2):
  12.     if id(charset1)==id(charset2):
  13.         return
  14.     charset1 |= charset
  15.     for c in charset2:
  16.         char2id[c] = id(charset1)
  17.     id2charset.pop(id(charset2))

  18. with open('test2') as reader:
  19.     for line in reader:
  20.         chars = line.strip().split()
  21.         newset = newcharset(chars)
  22.         id2charset[id(newset)] =newset

  23.         for c in chars:
  24.             charset = getcharset(c)
  25.             if charset:
  26.                 merge(newset, charset)
  27.             else:
  28.                 char2id[c] = id(newset)

  29. with open('report', 'w') as writer:
  30.     for id, charset in id2charset.items():
  31.         print(' '.join(charset), file=writer)
复制代码
回复 9# sunzhiguolu


   

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-14 06:20:00每日论坛发贴之星
日期:2015-10-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-08 06:20:00
14 [报告]
发表于 2016-07-18 23:02 |只看该作者
Thank you ,帅叔叔回复 10# jason680


   

论坛徽章:
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
15 [报告]
发表于 2016-07-19 00:14 |只看该作者
回复 13# mswsg
能否说下, 解题思路.

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP