免费注册 查看新帖 |

Chinaunix

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

求文本处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-17 21:35 来自手机 |只看该作者 |倒序浏览
晚上好,有如下文本:

a,1,2,e,2
b,q
a,9,2
需要处理为:
a,1,9,--,--,e,2
b,q
也就是说按第一列进行列比较,相同的项输出为-- 不同则放在一起

我最开始是以逗号为分隔符号,第一列为哈希key,然后指向一个数组,
但没折腾出想要的结果,因为
push @{$hash{$_}},@array[1..$#array];后,所得到的数组不是按列顺序的,所以不好处理,就卡在这一步了,烦请大侠指点

论坛徽章:
0
2 [报告]
发表于 2012-10-17 22:33 |只看该作者
what about this?
  1. push @{$hash{$_}},[ @array[1..$#array] ];
复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
3 [报告]
发表于 2012-10-18 09:20 |只看该作者
如下文本:
a,1,2,e,2
b,q
a,9,2
c,8
a,9,3

想要的结果为??需要处理为??

论坛徽章:
0
4 [报告]
发表于 2012-10-18 10:03 |只看该作者
rubyish 发表于 2012-10-18 09:20
如下文本:
a,1,2,e,2
b,q
希望楼主不要处理这种文本

论坛徽章:
0
5 [报告]
发表于 2012-10-18 10:21 |只看该作者
回复 3# rubyish

  现在的情况只有两行第一列相同的
,你那样的话
就处理成
a,1,--,--,--,--3,e,2
b,q
c,8
好了.
先教我怎么处理我的情况吧实在不懂

   

论坛徽章:
0
6 [报告]
发表于 2012-10-18 14:45 |只看该作者
回复 5# perlnewbie


    我按照一楼对比的逻辑无法得到这个结果,请指出逻辑错误:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;
  5. use List::Util qw( max );

  6. my %hash;
  7. while (<DATA>) {
  8.     chomp;
  9.     my ($k,@left) = split /,/ => $_;
  10.     push @{ $hash{$k} }, [ @left ];
  11. }

  12. foreach my $k ( sort keys %hash) {
  13.     my @values = @{ $hash{$k} };
  14.     my $z = shift @values;

  15.     foreach my $v (@values) {
  16.         $z = merge($z,$v);
  17.     }
  18.     print join( ',' => $k, @{$z} ), "\n";
  19. }

  20. sub merge {
  21.     my ($x,$y) = @_;
  22.     my $max = max( $#{$x}, $#{$y} );
  23.     my $z = [];
  24.     foreach my $i ( 0..$max ) {
  25.         push @$z => grep { $_ } ( $x->[$i] eq $y->[$i] )
  26.                               ? ( '--', '--' )
  27.                               : ( $x->[$i]  , $y->[$i] )
  28.                               ;
  29.     }
  30.     return $z;
  31. }

  32. __DATA__
  33. a,1,2,e,2
  34. b,q
  35. a,9,2
  36. c,8
  37. a,9,3
复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
7 [报告]
发表于 2012-10-19 08:36 |只看该作者
只有两行第一列相同的:
  1. #!/usr/bin/perl

  2. use 5.016;
  3. my ( %h, @a );
  4. while (<DATA>) {
  5.     my ( $a, @b ) = split /,|\n/;
  6.     push @a, $a unless $h{$a};
  7.     push @{ $h{$a} }, \@b;
  8. }

  9. for my $k (@a) {
  10.     my ( $i, $j ) = @{ $h{$k} };
  11.     my ($z) = sort { $b <=> $a } map $#$_, $i, $j;
  12.     say join ',', $k, map {
  13.         @_ = grep $_, @$i[$_], @$j[$_];
  14.         @_ > 1 && ( $_[0] eq $_[1] ) ? '--' : @_
  15.     } 0 .. $z;
  16. }

  17. __DATA__
  18. a,1,2,e,2
  19. b,q
  20. a,9,2
复制代码

论坛徽章:
0
8 [报告]
发表于 2012-10-19 23:17 |只看该作者
回复 7# rubyish

大哥,你应该叫perlish
现在没电脑,找了个网站跑了下你的代码.是不是只能5.16啊,网站perl版本是5.8
Unrecognized character \xC2 at line 5.


   

论坛徽章:
0
9 [报告]
发表于 2012-10-19 23:22 来自手机 |只看该作者
谢谢帅哥啊

论坛徽章:
0
10 [报告]
发表于 2012-10-19 23:25 来自手机 |只看该作者
谢谢眼镜哥
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP