Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl将行转置到列_Perl - Fatal编程技术网

Perl将行转置到列

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

我一直在寻找一些使用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,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
$

展示你的尝试?