Estoy realizando una búsqueda en un archivo a partir de otro, y hago un merge de los archivos
Ejemplo:
input1.txt
- Código: Seleccionar todo
'011200190ABELLÁN ABELLÁN CELIA '
'011200191ABELLÁN LLOBREGATSANDRA '
'011200192AGUILAR ESCRIBANOJAVIER '
'011200193AGULLÓ CRESPO ANA ISABEL'
'011200194ALBERO GARCÍA ELENA '
'011200195ALBERT SÁNCHEZ CRISTINA '
'011200196ALCARAZ BUADES DAVID '
'011200197ALDEGUER QUESADA SANTIAGO '
'011200198ALDEGUER SERRANO REBECA '
El archivo es posicional y ésta es su estructura:
Desde la posición 0 a la posición 1 es el Identificador del archivo.
Desde la posición 2 a la posición 8 es el Identificador de usuario.
Desde la posición 9 a la posición 35 es el Nombre usuario.
input2.txt
- Código: Seleccionar todo
'021200190097876541'
'021200191087876544'
'021200192089693803'
'021200194098765432'
'021200195098765232'
'021200196089768124'
'021200198097521358'
El archivo es posicional, esta es la estructura:
Desde la posición 0 a la posición 1 es el Identificador de archivo.
Desde la posición 2 a la posición 8 es el Identificador de usuario.
Desde la posición 9 a la posición 17 es el Numero de teléfono.
El archivo de salida tiene que quedar así.
- Código: Seleccionar todo
'011200190ABELLÁN ABELLÁN CELIA 021200190097876541'
'011200191ABELLÁN LLOBREGATSANDRA 021200191087876544'
'011200192AGUILAR ESCRIBANOJAVIER 021200192089693803'
'011200193AGULLÓ CRESPO ANA ISABEL '
'011200194ALBERO GARCÍA ELENA 021200194098765432'
'011200195ALBERT SÁNCHEZ CRISTINA 021200195098765232'
'011200196ALCARAZ BUADES DAVID 021200196089768124'
'011200197ALDEGUER QUESADA SANTIAGO '
'011200198ALDEGUER SERRANO REBECA 021200198097521358'
Si un usuario no tiene teléfono se debe llenar con espacios la línea hasta completar el largo.
En el ejemplo los usuarios ID 1200193, 1200197 no tienen teléfono.
Esto es lo que estoy haciendo:
Using perl Syntax Highlighting
#!/usr/bin/perl
open(DATA1,"input1.txt") or die "Error al abrir el archivo input1.txt";
open(DATA2,"input2.txt") or die "Error al abrir el archivo input2.txt";
open(DATA_MERGE,">>merge.txt") or die "Error al abrir el archivo merge";
@reg1 = <DATA1>;
@reg2 = <DATA2>;
$encontrado = '0';
#Recorro el archivo input1.txt
foreach $linea1 (@reg1)
{
# $elemento1 contiene el Id de usuario del archivo input1.txt
$elemento1 = substr($linea1,2,7);
#recorro desde el inicio el archivo input2.txt
foreach $linea2 (@reg2)
{
$largo_linea2 = length($linea2);
# $elemento2 contiene el Id de usuario del archivo input2.txt
$elemento2 = substr($linea2,2,7);
# Si los Is de usuario son iguales, imprimo en el archivo merge.txt
# las dos lineas
if ( $elemento1 eq $elemento2)
{
$encontrado = '1';
chomp($linea1);
print DATA_MERGE "$linea1$linea2";
last;
}
}
# Si no encuentro el Id de usuario en el input2.txt imprimo $linea1
# concatenada con espacios en el archivo merge.txt
if ( $encontrado eq '0')
{
chomp($linea1);
substr($linea1,length($linea1),0)=" "x $largo_linea2 ."\n";
print DATA_MERGE "$linea1";
}
$encontrado = '0';
}
close(DATA1);
close(DATA2);
close(DATA_MERGE);
open(DATA1,"input1.txt") or die "Error al abrir el archivo input1.txt";
open(DATA2,"input2.txt") or die "Error al abrir el archivo input2.txt";
open(DATA_MERGE,">>merge.txt") or die "Error al abrir el archivo merge";
@reg1 = <DATA1>;
@reg2 = <DATA2>;
$encontrado = '0';
#Recorro el archivo input1.txt
foreach $linea1 (@reg1)
{
# $elemento1 contiene el Id de usuario del archivo input1.txt
$elemento1 = substr($linea1,2,7);
#recorro desde el inicio el archivo input2.txt
foreach $linea2 (@reg2)
{
$largo_linea2 = length($linea2);
# $elemento2 contiene el Id de usuario del archivo input2.txt
$elemento2 = substr($linea2,2,7);
# Si los Is de usuario son iguales, imprimo en el archivo merge.txt
# las dos lineas
if ( $elemento1 eq $elemento2)
{
$encontrado = '1';
chomp($linea1);
print DATA_MERGE "$linea1$linea2";
last;
}
}
# Si no encuentro el Id de usuario en el input2.txt imprimo $linea1
# concatenada con espacios en el archivo merge.txt
if ( $encontrado eq '0')
{
chomp($linea1);
substr($linea1,length($linea1),0)=" "x $largo_linea2 ."\n";
print DATA_MERGE "$linea1";
}
$encontrado = '0';
}
close(DATA1);
close(DATA2);
close(DATA_MERGE);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
En el archivo input1.txt siempre están todos los usuarios y el archivo input2.txt están solo los usuarios que tienen teléfono.
Quiero optimizar el script para que no recorra siempre desde el inicio el archivo input2.txt, ya que debería buscar desde la última línea que fue encontrada, ya que los registros están en orden. Si todos los usuarios tuvieran teléfonos, input1.txt e input2.txt tendrían la misma cantidad de registros y estarían en la misma fila.
¿Como puedo mejorar el script para que no recorra siempre desde el inicio el input2.txt?
PD: Las comillas son solo referenciales para el largo de la línea.
Saludos