2009-07-28 6 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 

Iは以下に示すように、列2及び3とカラム4の値をマップします。

出力が必要です。

#! /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,2000 
sitename1,"A2",11,538 

は、私がこれまで試してみましたものです。

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

これは明らかではありません。質問を編集して、例と出力の両方を列に配置する必要があります。 –

+0

既にコードがありますか?何が問題ですか?あなたはどこにこだわっていますか? – innaM

+0

私の質問に自分のコメントを追加してくれてありがとうManni。任意の提案... – Space

答えて

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"; 
}; 
+0

ありがとうlarelogio、その非常に私のために役立つ。 – Space

1

私が正しくあなたを理解(と私は推測しているだけ認めざるを得ない)場合は、いくつかの異なる日付で、物事の種類とそれぞれの値を持っています。したがって、サイトごとにこのハッシュのようなデータ構造が必要です。

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

これは近いですか?