2009-07-28 40 views
0

我有一些文件包含以下数据。使用列标题和行标题映射值

样品文件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 

我想,如下所示,以在第4列中的值与列2和3映射。

需要输出。

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

这里是我到目前为止已经试过:

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

我得到的输出如下。

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

这还不清楚。您应该编辑问题并将示例和输出放入列中。 – 2009-07-28 08:55:31

+0

你已经有一些代码?问题是什么?你在哪里卡住? – innaM 2009-07-28 09:26:25

回答

0

下面的代码会产生预期的结果并使“某些”有意义。我不知道它是否真的有意义。

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"; 
}; 
1

如果我理解正确的话(我不得不承认,我只是猜测),你必须在不同的日期几种类型的东西和每个值。因此,您需要为每个站点使用像这样的哈希数据结构:

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

这是否更接近?