Aquí está mi problema. Tengo dos archivos de entrada (ejemplos simplificados):
Primero (fecha, id1, id2, estado, duración, tipo), llamado "entrada.dat":
- Código: Seleccionar todo
19/08/2008-10:26:45 C,14,219,1,0,1
19/08/2008-10:27:46 C,13,222,2,0,3
...
Segundo (expresión regular, identificador), llamado "regexp.dat":
- Código: Seleccionar todo
/^1/,OPERADOR1
/^2/,OPERADOR2
/^3/,OPERADOR2
/^4/,OPERADOR3
/^5/,OPERADOR1
/^6/,OPERADOR1
/^7/,OPERADOR2
/^8/,OPERADOR3
/^9/,OPERADOR1
A partir de estos dos archivos de entrada, debo generar un tercero (digamos "salida.dat") que contenga todas las lineas de "entrada.dat", pero con una columna adicional correspondiente a campo identificador del archivo "regexp.dat".
Para buscar el identificador debo leer cada línea de "entrada.dat" y hacer match del campo id1 con la expresión regular de "regexp.dat" (observar que los identificadores de "regexp.dat" pueden tener más de una expresión regular asociada).
Aquí pego lo que he estado tratando de hacer, pero quedo pegada en la forma de recorrer las expresiones regulares cuando estoy recorriendo "entrada.dat":
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
#Guarda las expresiones regulares en la matriz regexp
open ( RE, 'regexp.dat' );
while ( <RE> ) {
chomp;
@line_re = split ( ",", $_ );
$operator = @linea_re[1];
$regexp{$operator} = @linea_re[0];
}
close ( RE );
open ( SALIDA, '>salida.dat');
open ( ENTRADA, 'entrada.dat' ) or die "$!\n";
while ( <ENTRADA> ) {
($date,$id1,$id2,$st,$dur,$typ) = split ( ",", $_ );
#Aqui debo hacer match entre $id1 y algo asi como
#el contenido de $regexp{ ... } (que es la exp. regular)
#Si hay match, debe imprimirse en SALIDA + ",la key de regexp
}
close ( SALIDA );
close ( ENTRADA );
use strict;
use warnings;
use diagnostics;
#Guarda las expresiones regulares en la matriz regexp
open ( RE, 'regexp.dat' );
while ( <RE> ) {
chomp;
@line_re = split ( ",", $_ );
$operator = @linea_re[1];
$regexp{$operator} = @linea_re[0];
}
close ( RE );
open ( SALIDA, '>salida.dat');
open ( ENTRADA, 'entrada.dat' ) or die "$!\n";
while ( <ENTRADA> ) {
($date,$id1,$id2,$st,$dur,$typ) = split ( ",", $_ );
#Aqui debo hacer match entre $id1 y algo asi como
#el contenido de $regexp{ ... } (que es la exp. regular)
#Si hay match, debe imprimirse en SALIDA + ",la key de regexp
}
close ( SALIDA );
close ( ENTRADA );
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Lo que les presento aquí es una forma que pensé que podía almacenar las reg. exp. en una matriz asociativa para recorrerla, pero al ir codificando me di cuenta que o bien no sabía cómo hacer o bien... no se puede...
También podría almacenar el archivo de regexp en una lista, pero nuevamente no sé cómo recorrerla para hacer el match.
Les agradecería mucho su ayuda.
Saludos,
Init_perl