J'ai cherché des moyens de transposer un gros fichier csv en utilisant Perl, mais je n'arrive pas à faire les choses correctement avec mes boucles.
Il y a une ligne d'en-tête avec 7 colonnes (j'ai plus de 200 colonnes en fait) . Les 3 premières colonnes sont fixes et les colonnes suivantes sont des nombres. Si le montant du compte est égal à 0, ignorez et ne transposez pas.
Données source:
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
Données transposées:
Name,Age,Gender,Acct1,Acct2,Acct3,Acct4 Jack,12,M,10,20,0,999 Mary,20,F,40,50,0,111
3 Réponses :
En supposant que vous ayez lu le CSV dans un tableau de tableaux avec l'un des modules CSV (veuillez ne pas analyser le CSV vous-même), je procéderais comme ceci:
$ 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
Exemple de sortie :
#!/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"; }
Je suppose que ces données source se trouvent dans un fichier, plutôt que d'être facilement analysées dans une affectation 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]; } } }
Utilisation de Perl one-liner
$ 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 $
montre ce que tu as essayé?