2009-07-28 2 views
0

Ich habe einige Dateien mit darunter liegenden Daten.Mapping Werte mit Spaltenkopf und Zeilenkopf

Beispieldatei 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 

Ich mag die Werte in Spalte 4 mit Spalte 2 und 3 zur Karte wie unten gezeigt.

Ausgabe erforderlich.

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

Hier ist, was ich bisher versucht habe:

#! /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=[]; 
} 

Der Ausgang i wie unten bin immer ist.

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

Dies ist nicht klar. Sie sollten die Frage bearbeiten und sowohl das Beispiel als auch die Ausgabe in Spalten platzieren. –

+0

Haben Sie bereits Code? Was ist das Problem? Wo steckst du fest? – innaM

+0

Danke Manni für das Hinzufügen meiner Kommentare zu meiner Frage. Irgendwelche Vorschläge ... – Space

Antwort

0

Der folgende Code erzeugt das erwartete Ergebnis und macht "etwas" Sinn. Ich weiß nicht, ob es wirklich Sinn macht.

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

Danke larelogio, es ist sehr hilfreich für mich. – Space

1

Wenn ich Sie richtig verstanden habe (und ich habe ich nur zugeben, ich raten), haben Sie verschiedene Arten von Dingen zu unterschiedlichen Terminen und Wert für jeden. So müssen Sie eine Datenstruktur wie dieser Hash für jede Website:

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

Ist das einmal in der Nähe?