Perl将行转置到列
我一直在寻找一些使用Perl转置大型csv文件的方法,但我的循环无法正确实现 有一个标题行有7列(实际上我有200多列)。前3列是固定的,后面的列是数字。如果帐户金额为0,则跳过并不转置 来源数据:Perl将行转置到列,perl,Perl,我一直在寻找一些使用Perl转置大型csv文件的方法,但我的循环无法正确实现 有一个标题行有7列(实际上我有200多列)。前3列是固定的,后面的列是数字。如果帐户金额为0,则跳过并不转置 来源数据: Name,Age,Gender,Acct1,Acct2,Acct3,Acct4 Jack,12,M,10,20,0,999 Mary,20,F,40,50,0,111 转置数据: Column_ID,Name,Age,Gender,Acct 4,Jack,12,M,10 5,Jack,12,M,2
Name,Age,Gender,Acct1,Acct2,Acct3,Acct4
Jack,12,M,10,20,0,999
Mary,20,F,40,50,0,111
转置数据:
Column_ID,Name,Age,Gender,Acct
4,Jack,12,M,10
5,Jack,12,M,20
7,Jack,12,M,999
4,Mary,20,F,40
5,Mary,20,F,50
7,Mary,20,F,111
假设您已将CSV读入带有CSV模块之一的数组(请不要自己解析CSV),我将这样继续:
#/usr/bin/perl
严格使用;
使用警告;
我的@rows=(
[Jack',12,'M',10,20,0999],
[Mary',20,'F',40,50,0111],
);
我的@output;
foreach my$行(@行){
foreach my$col(3..$#{$row}){
如果($row->[$col]!=0){
push(@output,[$col+1,@{$row}[0,1,2,$col]]);
}
}
}
foreach my$行(@output){
打印联接(“,”,@{$row}),“\n”;
}
示例输出:
$perl dummy.pl
4,杰克,12,米,10
5,杰克,12,米,20
7,Jack,12,M,999
玛丽,20岁,F,40岁
玛丽,20岁,F,50岁
7、玛丽、20、F、111
我猜这些源数据是在一个文件中,而不是方便地解析成一个perl赋值
#!/usr/bin/perl
use strict;
use warnings;
print "Column_ID,Name,Age,Gender,Acct\n";
foreach my $file (@ARGV) {
open my $FH, '<', $file
or warn("Couldn't open $file: $!\n"), next;
while (<$FH>) {
chomp;
my @cols = split /\,/;
my @retained = @rows[0 .. 2];
foreach my $col (3 .. $#cols) {
print join(',', 1 + $col, @retained, $cols[$col]) . "\n"
if $cols[$col];
}
}
}
#/usr/bin/perl
严格使用;
使用警告;
打印“列号、姓名、年龄、性别、帐户”;
foreach my$文件(@ARGV){
使用Perl one liner打开我的$FH,“
$ cat liquan.txt
Name,Age,Gender,Acct1,Acct2,Acct3,Acct4
Jack,12,M,10,20,0,999
Mary,20,F,40,50,0,111
$ perl -F, -lane ' BEGIN { print "Column_ID,Name,Age,Gender,Acct" } for(3..$#F) { if($F[$_]!=0 and $.>1) { print $_+1,",$F[0],$F[1],$F[2],",$F[$_] }}' liquan.txt
Column_ID,Name,Age,Gender,Acct
4,Jack,12,M,10
5,Jack,12,M,20
7,Jack,12,M,999
4,Mary,20,F,40
5,Mary,20,F,50
7,Mary,20,F,111
$
展示你的尝试?