sábado, 8 de agosto de 2009

Cuchareando datos

El miércoles hice este programilla para interpolar unos datos faltantes. Supongo que no les gustó pues siguen intentándolo en C.

#!/usr/bin/perl -wl

use POSIX qw(strftime);

my $last;
my @bar;

while(<>) {
chomp;
my @foo=split ",";
next unless $foo[0];
my $date=qx(date +%s -d $foo[0]);
next unless $date;
my $this=int($date);
next unless $this;
if($last) {
my $diff=$this - $last;
if ($diff>300) {
my @m;
$m[$_]=($foo[$_]-$bar[$_])/$diff foreach(1..$#foo);
my @b;
$b[$_]=$foo[$_]-$m[$_]*$this foreach(1..$#foo);

for(my $t=$last+300; $t<=$this-300; $t+=300) {
my @y;
push @y, strftime(qq("%Y-%m-%d %H:%M:%S"),localtime $t);
push @y, $m[$_]*$t + $b[$_] foreach(1..$#foo);
local $"=q(,);
print "@y";
}
}
}
$last=$this;
@bar=@foo;
}
continue { print }


El script aún se puede perfeccionar, creo que me sobran unas cuántas líneas, y por supuesto, hay que bautizar las variables @foo y @bar por algo más apropiado.