Tengo que implementar un script Perl que haga lo siguiente:
- Leer fichero del tipo CSV (campos separados por el carácter ';' )
- Dicho fichero tiene una primera línea y última línea que debo ignorar, o mejor dicho, copiar literalmente en el fichero de salida.
- A partir de la segunda línea del fichero, encontramos los campos separados por ';'.
- El primer campo de la línea lo llamare CARF y su valor puede aparecer repetido en diferentes líneas. El segundo campo es una especie de TimeStamp o medida de tiempo.
El objetivo de mi script, es el de suprimir las líneas repetidas y quedarme con sólo una línea por CARF, concretamente aquella con el campo TimeStamp más grande. - A continuación de los 2 campos antes mencionados, tengo 26 campos más, pero que no intervienen en el algoritmo y que deseo guardar tal cual.
De momento tengo la siguiente función pero que no me funciona del todo bien:
Using perl Syntax Highlighting
# Process file removing repeated lines
sub processFile() {
open(INFILE,"<$file_o") or die "Problem encountered opening input file\n";
open(OUTFILE,">$file_o.mod") or die "Problem encountered generating output file\n";
while (my $I=<INFILE>)
{
if ($lineCounter == 0){
print OUTFILE $I;
$lineCounter++;
}
else {
($carf, $starttime) = ($I =~ /^(\s+);(\d+);/);
if ((! defined $carfStartTimes{$carf}) && (! defined $carfLines{$carf}))
{
$carfLines{$carf}= $I;
$carfStartTimes{$carf}= $starttime;
}
if ($starttime >= $carfStartTimes{$carf})
{
$carfLines{$carf} = $I;
$carfStartTimes{$carf} = $starttime;
}
$lineCounter++;
}
}
foreach my $line (%carfLines) {
print OUTFILE $line;
}
close(INFILE);
close(OUTFILE);
}
sub processFile() {
open(INFILE,"<$file_o") or die "Problem encountered opening input file\n";
open(OUTFILE,">$file_o.mod") or die "Problem encountered generating output file\n";
while (my $I=<INFILE>)
{
if ($lineCounter == 0){
print OUTFILE $I;
$lineCounter++;
}
else {
($carf, $starttime) = ($I =~ /^(\s+);(\d+);/);
if ((! defined $carfStartTimes{$carf}) && (! defined $carfLines{$carf}))
{
$carfLines{$carf}= $I;
$carfStartTimes{$carf}= $starttime;
}
if ($starttime >= $carfStartTimes{$carf})
{
$carfLines{$carf} = $I;
$carfStartTimes{$carf} = $starttime;
}
$lineCounter++;
}
}
foreach my $line (%carfLines) {
print OUTFILE $line;
}
close(INFILE);
close(OUTFILE);
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Concretamente, se queja cuando hago
Using perl Syntax Highlighting
if ((! defined $carfStartTimes{$carf}) && (! defined $carfLines{$carf}))
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
El resultado de la ejecución:
- Código: Seleccionar todo
Use of uninitialized value in hash element at RemoveRepeatedCARF.pl line 83, <INFILE> line 2.
Use of uninitialized value in hash element at RemoveRepeatedCARF.pl line 83, <INFILE> line 2.
Use of uninitialized value in hash element at RemoveRepeatedCARF.pl line 85, <INFILE> line 2.
Use of uninitialized value in hash element at RemoveRepeatedCARF.pl line 86, <INFILE> line 2.
Use of uninitialized value in hash element at RemoveRepeatedCARF.pl line 88, <INFILE> line 2.
Use of uninitialized value in numeric ge (>=) at RemoveRepeatedCARF.pl line 88, <INFILE> line 2.
Use of uninitialized value in numeric ge (>=) at RemoveRepeatedCARF.pl line 88, <INFILE> line 2.
Use of uninitialized value in hash element at RemoveRepeatedCARF.pl line 90, <INFILE> line 2.
Use of uninitialized value in hash element at RemoveRepeatedCARF.pl line 91, <INFILE> line 2.
...
¿Alguien sabe cómo solucionar mi problema?
¿Cómo tomar en cuenta lo de la última línea (la que no debo tratar)?
¿Cómo inicializar un hash y cómo saber si un key existe ya, pues es eso lo que me falla?
Muchas gracias por adelantado,
Felipe