免费注册 查看新帖 |

Chinaunix

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

perl求助,求一个矩阵的转换。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-04 18:24 |只看该作者 |倒序浏览
本帖最后由 xiayuu119 于 2014-09-04 18:27 编辑

我是数据是:行列都非常多
n A B C D E F G
a 1 2 3 4 5 6 7
b 2 3 4 5 6 7 8
c 2 3 5 6 1 5 1

转换成:
A a 1
A b 2
A c 2
B a 2
B b 3
B c 3
.
.
.
.

将这个矩阵转换为 3列。

新手一个,请大家帮忙啊!

论坛徽章:
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
2 [报告]
发表于 2014-09-04 19:26 |只看该作者
本帖最后由 stanley_tam 于 2014-09-04 19:29 编辑

数据很大,那就每次读一行?{:3_184:}
  1. #!perl
  2. use strict;
  3. use FileHandle;

  4. my $file   = 'a.txt';
  5. my $fh     = FileHandle->new($file, 'r');
  6. my @header = split /\s+/, $fh->getline;

  7. while (my $line = $fh->getline) {
  8.     my @parts   = split /\s+/, $line;
  9.     for my $i ( 1 .. $#parts ) {
  10.         print "$header[$i]$parts[0]$parts[$i]\n";
  11.     }
  12. }

  13. __END__
复制代码

论坛徽章:
0
3 [报告]
发表于 2014-09-04 20:01 |只看该作者
stanley_tam 发表于 2014-09-04 19:26
数据很大,那就每次读一行?


很好用! 感觉很巧妙!~~~大神~~非常感谢!!

论坛徽章:
0
4 [报告]
发表于 2015-05-25 09:50 |只看该作者
回复 2# stanley_tam


    再请教一下,如果我反着进行应该如何做呢?就是把“三列 转换成 矩阵”?

论坛徽章:
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
5 [报告]
发表于 2015-05-26 19:13 |只看该作者
貌似回答已经是很久以前的事情了。
下面这个你看行不行咯
  1. #!perl
  2. use strict;
  3. use FileHandle;

  4. my $file   = 'a.txt';
  5. my $fh     = FileHandle->new($file, 'r');
  6. my $data   = +{};
  7. my @row    = ();
  8. my @col    = ();

  9. sub _uniq {
  10.     my %seen = ();
  11.     return grep { ! $seen{$_} ++ } @_
  12. };

  13. while (my $line = $fh->getline) {
  14.     my @parts   = split /\s+/, $line;
  15.     push @row, $parts[0];
  16.     push @col, $parts[1];
  17.     $data->{$parts[0]}->{$parts[1]} = $parts[2];
  18. }

  19. @row = _uniq(@row);
  20. @col = _uniq(@col);

  21. print join ' ', 'n', @row, $/;
  22. for my $c (@col){
  23.     my $line = $c;
  24.     for my $r (@row){
  25.         $line .= " $data->{$r}->{$c}"
  26.     }
  27.     print "$line$/";
  28. }

  29. __END__
复制代码

论坛徽章:
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
6 [报告]
发表于 2015-05-26 22:59 |只看该作者
biru:
  1. #!/usr/bin/perl

  2. my ( undef, @ABC ) = split /\s+/, <DATA>;
  3. my ( @abc, @data );

  4. while (<DATA>) {
  5.     my ( $abc, @num, $i ) = split;
  6.     push @abc, $abc;
  7.     push @{ $data[ $i++ ] }, $_ for @num;
  8. }

  9. for my $e (@data) {
  10.     my ( $ABC, $i ) = shift @ABC;
  11.     print map join( "\t", $ABC, $abc[ $i++ ], $_ ) . $/, @$e;
  12. }


  13. __DATA__
  14. n A B C D E F G
  15. a 1 2 3 4 5 6 7
  16. b 2 3 4 5 6 7 8
  17. c 2 3 5 6 1 5 1
复制代码
and biru:
  1. #!/usr/bin/perl

  2. use 5.018;

  3. my ( @ABC, @abc, @data, $i );
  4. while (<DATA>) {
  5.     my ( $ABC, $abc, $n ) = split;
  6.     if ( !@ABC or $ABC ne $ABC[-1] ) {
  7.         push @ABC, $ABC;
  8.         $i = 0;
  9.     }
  10.     push @{ $data[ $i++ ] }, $n;
  11.     push @abc, $abc if @abc < @data;
  12. }

  13. say join "\t", 'n', @ABC; # <== here 'n'
  14. say join "\t", shift @abc, @$_ for @data;

  15. __DATA__
  16. A       a       1
  17. A       b       2
  18. A       c       2
  19. B       a       2
  20. B       b       3
  21. B       c       3
  22. C       a       3
  23. C       b       4
  24. C       c       5
  25. D       a       4
  26. D       b       5
  27. D       c       6
  28. E       a       5
  29. E       b       6
  30. E       c       1
  31. F       a       6
  32. F       b       7
  33. F       c       5
  34. G       a       7
  35. G       b       8
  36. G       c       1
复制代码

论坛徽章:
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
7 [报告]
发表于 2016-09-21 12:33 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my @aData = map [split], <DATA>;
  5. shift @{$aData[0]};
  6. while (my $th = shift @{$aData[0]}){
  7.     print join ("\t", $th, $aData[$_]->[0], splice (@{$aData[$_]}, 1, 1)), "\n" for 1 .. $#aData;
  8. }

  9. __DATA__
  10. n A B C D E F G
  11. a 1 2 3 4 5 6 7
  12. b 2 3 4 5 6 7 8
  13. c 2 3 5 6 1 5 1
复制代码

论坛徽章:
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
8 [报告]
发表于 2016-09-21 12:33 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my @aData = map [split], <DATA>;
  5. shift @{$aData[0]};
  6. while (my $th = shift @{$aData[0]}){
  7.     print join ("\t", $th, $aData[$_]->[0], splice (@{$aData[$_]}, 1, 1)), "\n" for 1 .. $#aData;
  8. }

  9. __DATA__
  10. n A B C D E F G
  11. a 1 2 3 4 5 6 7
  12. b 2 3 4 5 6 7 8
  13. c 2 3 5 6 1 5 1
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP