2009-07-28 3 views
0

J'ai quelques fichiers avec les données ci-dessous.Valeurs de mappage avec en-tête de colonne et en-tête de ligne

exemple de fichier 1:

sitename1,2009-07-19,"A1",11975,17.23 
sitename1,2009-07-19,"A2",11,0.02 
sitename1,2009-07-20,"A1",2000,17.23 
sitename1,2009-07-20,"A2",538,0.02 

Je veux cartographier les valeurs de la colonne 4 de la colonne 2 et 3 comme indiqué ci-dessous.

Sortie requise.

Site,Type,2009-07-19,2009-07-20 
sitename1,"A1",11975,2000 
sitename1,"A2",11,538 

Voici ce que je l'ai essayé jusqu'à présent:

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

my $column_header=["Site,Type"]; 
my $position={}; 
my $last_position=0; 
my $current_event=[]; 

my $events=[]; 

while (<STDIN>) { 
    my ($site,$date,$type,$value,$percent) = split /[,\n]/, $_; 
    my $event_key = $date; 

    if (not defined $position->{$event_key}) { 
     $last_position+=1; 
     $position->{$event_key}=$last_position; 
     push @$column_header,$event_key; 
    } 
    my $pos = $position->{$event_key}; 
    if (defined $current_event->[$pos]) { 
     dumpEvent(); 
    } 
    if (not defined $current_event->[0]) { 
     $current_event->[0]="$site,$type"; 
    } 
    $current_event->[$pos]=$value; 
} 

dumpEvent(); 

my $order = []; 
for (my $scan=0; $scan<scalar(@$column_header); $scan++) { 
    push @$order,$scan; 
} 

printLine($column_header); 
map { printLine($_) } @$events; 

sub printLine { 
    my $record=shift; 

    my @result=(); 
    foreach my $offset (@$order) { 
     if (defined $record->[$offset]) { 
      push @result,$record->[$offset]; 
     } else { 
      push @result,""; 
     } 
    } 
    print join(",",@result)."\n"; 
} 

sub dumpEvent { 
    return unless defined $current_event->[0]; 
    push @$events,$current_event; 
    $current_event=[]; 
} 

La sortie je reçois est comme ci-dessous.

*Site,Type,2009-07-19,2009-07-20* 
sitename1,"A1",11975, 
sitename1,"A2",11, 
sitename1,"A1",,14620 
sitename1,"A2",,538 
+1

Ceci n'est pas clair. Vous devez modifier la question et placer l'exemple et la sortie dans des colonnes. –

+0

Avez-vous déjà du code? Quel est le problème? Où es-tu coincé? – innaM

+0

Merci Manni d'avoir ajouté mes commentaires à ma question. Toutes les suggestions ... – Space

Répondre

0

Le code suivant produit le résultat attendu et a un sens "quelconque". Je ne sais pas si cela a vraiment du sens.

my %dates; 
my %SiteType; 
while (<DATA>) { 
    chomp; 
    my ($site,$date,$type,$value,$percent) = split /,/; 
    $dates{$date} = '1'; 
    push @{$SiteType{"$site,$type"}}, $value ; 
}; 
print 'Site,Type,', join(',', sort keys %dates), "\n"; 
foreach (sort keys %SiteType) { 
    print $_, ',', join(',', @{$SiteType{$_}}), "\n"; 
}; 
+0

Merci larelogio, c'est très utile pour moi. – Space

1

Si je vous comprends bien (et je dois admettre que je suis seulement deviner), vous avez plusieurs types de choses à différentes dates et une valeur pour chacun. Ainsi, vous avez besoin d'une structure de données comme ce hachage pour chaque site:

$foo = { 
    site => 'sitename1', 
    type => 'A1', 
    dates => [ 
       { 
        date => '2009-07-19', 
        value => 11975, 
       }, 
       { 
        date => '2009-07-20', 
        value => 538, 
       }, 
      ], 
}; 

Est-ce encore proche?

Questions connexes