Perl транспонировать строку в столбец - PullRequest
0 голосов
/ 13 января 2019

Я искал несколько способов транспонировать большой CSV-файл, используя Perl, но не могу сделать это правильно с моими циклами.

Есть строка заголовка с 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

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Я предполагаю, что эти исходные данные находятся в файле, а не разбираются вручную в присваивании 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];
        }
    }
}
0 голосов
/ 16 января 2019

Использование Perl однострочного

$ 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
$
0 голосов
/ 13 января 2019

Предполагая, что вы прочитали CSV в массив массивов с одним из модулей CSV (пожалуйста, не анализируйте CSV самостоятельно), я бы поступил так:

#!/usr/bin/perl
use strict;
use warnings;

my @rows = (
    ['Jack',12,'M',10,20,0,999],
    ['Mary',20,'F',40,50,0,111],
    );

my @output;
foreach my $row (@rows) {
   foreach my $col (3..$#{$row}) {
       if ($row->[$col] != 0) {
           push(@output, [$col + 1, @{$row}[0,1,2,$col]]);
       }
   }
}

foreach my $row (@output) {
    print join(',', @{$row}), "\n";
}

Пример вывода:

$ perl dummy.pl
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...