免费注册 查看新帖 |

Chinaunix

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

【问题】连续区间合并 [复制链接]

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
1 [报告]
发表于 2014-08-12 21:30 |显示全部楼层
本帖最后由 stanley_tam 于 2014-08-12 21:36 编辑

貌似设置几个变量记录上一行的信息和start number就可以了,这样行不行{:3_193:}
  1. #!perl
  2. use Modern::Perl;
  3. use FileHandle;

  4. my $your_data_file = 'a.txt';
  5. my $fh = FileHandle->new($your_data_file, 'r');

  6. my $start_num = q{};
  7. my $last_line = [ q{}, q{}, 0, q{}, q{}, q{} ];

  8. my $count = 0;
  9. while (my $line = $fh->getline) {
  10.     # remove trailing newline
  11.     chomp $line;

  12.     # get columns of current line
  13.     my $current_line = [(split /\s+/, $line)];

  14.     # compare currentline with last line
  15.     if ($current_line->[2] == $last_line->[2] + 1) { # number increase by one
  16.         
  17.         if ($last_line->[1] eq $current_line->[1] and
  18.             $last_line->[4] eq $current_line->[4] and
  19.             $last_line->[5] eq $current_line->[5]) { # column 2, 5, 6 are equal
  20.             # valid consecutive row, note it
  21.             ++$count;
  22.         }
  23.         else {
  24.             # column 2, 5, 6 not equal
  25.             # the first line doesn't count, $count equal 2 suffice
  26.             if ($count >= 2) {
  27.                 my @copy = @{ $last_line };
  28.                 $copy[2] = "$start_num-$copy[2]";
  29.                 say join "\t", @copy;
  30.             }

  31.             # reset
  32.             $start_num = $current_line->[2];
  33.             $count     = 0;
  34.         }
  35.     }
  36.     else {
  37.         # number not consecutive
  38.         if ($count >= 2) {
  39.             my @copy = @{ $last_line };
  40.             $copy[2] = "$start_num-$copy[2]";
  41.             say join "\t", @copy;
  42.         }

  43.         # reset
  44.         $start_num = $current_line->[2];
  45.         $count     = 0;
  46.     }

  47.     $last_line = $current_line;
  48. }

  49. $fh->close;

  50. __END__
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP