Chinaunix

标题: perl求助,求一个矩阵的转换。 [打印本页]

作者: xiayuu119    时间: 2014-09-04 18:24
标题: perl求助,求一个矩阵的转换。
本帖最后由 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列。

新手一个,请大家帮忙啊!
作者: stanley_tam    时间: 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__
复制代码

作者: xiayuu119    时间: 2014-09-04 20:01
stanley_tam 发表于 2014-09-04 19:26
数据很大,那就每次读一行?


很好用! 感觉很巧妙!~~~大神~~非常感谢!!
作者: xiayuu119    时间: 2015-05-25 09:50
回复 2# stanley_tam


    再请教一下,如果我反着进行应该如何做呢?就是把“三列 转换成 矩阵”?
作者: stanley_tam    时间: 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__
复制代码

作者: rubyish    时间: 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
复制代码

作者: sunzhiguolu    时间: 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
复制代码

作者: sunzhiguolu    时间: 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
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2