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:}
#!perl
use strict;
use FileHandle;
my $file = 'a.txt';
my $fh = FileHandle->new($file, 'r');
my @header = split /\s+/, $fh->getline;
while (my $line = $fh->getline) {
my @parts = split /\s+/, $line;
for my $i ( 1 .. $#parts ) {
print "$header[$i]$parts[0]$parts[$i]\n";
}
}
__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
貌似回答已经是很久以前的事情了。
下面这个你看行不行咯
#!perl
use strict;
use FileHandle;
my $file = 'a.txt';
my $fh = FileHandle->new($file, 'r');
my $data = +{};
my @row = ();
my @col = ();
sub _uniq {
my %seen = ();
return grep { ! $seen{$_} ++ } @_
};
while (my $line = $fh->getline) {
my @parts = split /\s+/, $line;
push @row, $parts[0];
push @col, $parts[1];
$data->{$parts[0]}->{$parts[1]} = $parts[2];
}
@row = _uniq(@row);
@col = _uniq(@col);
print join ' ', 'n', @row, $/;
for my $c (@col){
my $line = $c;
for my $r (@row){
$line .= " $data->{$r}->{$c}"
}
print "$line$/";
}
__END__
复制代码
作者:
rubyish
时间:
2015-05-26 22:59
biru:
#!/usr/bin/perl
my ( undef, @ABC ) = split /\s+/, <DATA>;
my ( @abc, @data );
while (<DATA>) {
my ( $abc, @num, $i ) = split;
push @abc, $abc;
push @{ $data[ $i++ ] }, $_ for @num;
}
for my $e (@data) {
my ( $ABC, $i ) = shift @ABC;
print map join( "\t", $ABC, $abc[ $i++ ], $_ ) . $/, @$e;
}
__DATA__
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
复制代码
and biru:
#!/usr/bin/perl
use 5.018;
my ( @ABC, @abc, @data, $i );
while (<DATA>) {
my ( $ABC, $abc, $n ) = split;
if ( !@ABC or $ABC ne $ABC[-1] ) {
push @ABC, $ABC;
$i = 0;
}
push @{ $data[ $i++ ] }, $n;
push @abc, $abc if @abc < @data;
}
say join "\t", 'n', @ABC; # <== here 'n'
say join "\t", shift @abc, @$_ for @data;
__DATA__
A a 1
A b 2
A c 2
B a 2
B b 3
B c 3
C a 3
C b 4
C c 5
D a 4
D b 5
D c 6
E a 5
E b 6
E c 1
F a 6
F b 7
F c 5
G a 7
G b 8
G c 1
复制代码
作者:
sunzhiguolu
时间:
2016-09-21 12:33
#!/usr/bin/perl
use strict;
use warnings;
my @aData = map [split], <DATA>;
shift @{$aData[0]};
while (my $th = shift @{$aData[0]}){
print join ("\t", $th, $aData[$_]->[0], splice (@{$aData[$_]}, 1, 1)), "\n" for 1 .. $#aData;
}
__DATA__
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
复制代码
作者:
sunzhiguolu
时间:
2016-09-21 12:33
#!/usr/bin/perl
use strict;
use warnings;
my @aData = map [split], <DATA>;
shift @{$aData[0]};
while (my $th = shift @{$aData[0]}){
print join ("\t", $th, $aData[$_]->[0], splice (@{$aData[$_]}, 1, 1)), "\n" for 1 .. $#aData;
}
__DATA__
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
复制代码
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2