【问题标题】:Mapping values with Column header and row header使用列标题和行标题映射值
【发布时间】:2010-11-14 15:09:47
【问题描述】:

我有一些包含以下数据的文件。

示例文件 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 

【问题讨论】:

  • 这不清楚。您应该编辑问题并将示例和输出放在列中。
  • 你已经有一些代码了吗?问题是什么?你被困在哪里了?
  • 感谢 Manni 将我的 cmets 添加到我的问题中。任何建议...

标签: perl perl-module


【解决方案1】:

以下代码产生了预期的结果,并具有“某种”意义。我不知道这是否真的有意义。

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

【讨论】:

  • 谢谢larelogio,它对我很有帮助。
【解决方案2】:

如果我对您的理解正确(我不得不承认我只是在猜测),那么您在不同的日期有几种类型的事物,并且每种事物都有一个值。因此,每个站点都需要像这样的哈希数据结构:

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

这还差不多吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 2019-09-13
    • 2016-02-06
    • 2021-09-30
    • 2015-04-14
    • 2012-02-06
    相关资源
    最近更新 更多