【发布时间】:2017-09-24 08:54:21
【问题描述】:
我有这张桌子:
NAME |12/31/2016|VALUE
AAA |1/31/2017 |10
AAA |2/1/2017 |20
AAA |2/2/2017 |30
AAA |2/3/2017 |40
AAA |2/4/2017 |50
NAME |2/9/2017 |VALUE
BBB |2/10/2017 |20
BBB |2/11/2017 |30
BBB |2/12/2017 |40
BBB |2/13/2017 |50
BBB |2/14/2017 |60
这将是我想要的输出:
NAME |DATE |VALUE
AAA |12/31/2016 |150
AAA |1/31/2017 |140
AAA |2/1/2017 |120
NAME |DATE |VALUE
BBB |2/9/2017 |200
BBB |2/10/2017 |180
BBB |2/11/2017 |150
我想要做的是,对于每个有效符号,(AAA,BBB)我想要三行。
对于每一列的第一行,我想要添加所有值,
例如,AAA 的第 1 行值:
10+20+30+40+50 = 150
然后对于第 2 行,我只想从第二个值添加到最后一个值。
例如 AAA 的第 2 行值
20+30+40+50 = 140
BBB 也是如此。
我想将日期向下移动,以便 12/31/2016 与 AAA 匹配,然后获取每行的前三个日期。
我目前有这个代码。但这并没有多大作用。它只是给了我一堆数字。
use strict;
use warnings;
use Scalar::Util qw(looks_like_number);
use Data::Dumper;
sub uniq {
my %seen;
grep !$seen{$_}++, @_;
}
my %cashflow;
my %fields = (
ID => 0,
DATES => 1,
VALUE => 2,
);
my @total;
my @IDs;
my @uniqueIDs;
my @dates;
my @add;
my $i = 0;
my @values;
my $counter = 3;
open( FILE, "try.CSV" );
while ( my $line = <FILE> ) {
chomp( $line );
my @lineVals = split( /\|/, $line );
if ( $lineVals[ $fields{ID} ] !~ /^SYMBOL$/i ) {
push @IDs, $lineVals[ $fields{ID} ];
}
@uniqueIDs = uniq( @IDs );
#push all CASH FLOW AMOUNTS to @cashflow
if ( looks_like_number( $lineVals[ $fields{VALUE} ] ) ) {
$lineVals[ $fields{VALUE} ] =~ s/\r//;
push @total, $lineVals[ $fields{VALUE} ];
}
if ( $lineVals[ $fields{DATES} ] =~ /(\d{1,2})\/(\d{1,2})\/(\d{4})/ ) {
$lineVals[ $fields{DATES} ] = sprintf( '%04d%02d%02d', $3, $2, $1 );
}
$cashflow{ uc $lineVals[ $fields{ID} ] }{DATES} = $lineVals[ $fields{DATES} ];
$cashflow{ uc $lineVals[ $fields{ID} ] }{VALUE} = $lineVals[ $fields{VALUE} ];
foreach my $ID ( @uniqueIDs ) {
foreach my $symb ( keys %cashflow ) {
if ( $ID = $symb ) {
if ( looks_like_number( $lineVals[ $fields{VALUE} ] ) ) {
$lineVals[ $fields{VALUE} ] =~ s/\r//;
push @total, $lineVals[ $fields{VALUE} ];
my $i = 0;
my $grand = 0;
foreach my $val ( @total ) {
while ( $i < $counter ) {
$grand += $val;
print "$grand \n";
$i++;
}
shift @total;
}
}
}
}
}
}
close FILE;
我真的很纠结这个。我不知道如何处理这个问题。
【问题讨论】:
标签: arrays perl hash sum shift