• Publicidad

Búsqueda de cadenas en un archivo

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Re: Búsqueda de cadenas en un archivo

Notapor titantux » 2013-02-02 22:50 @993

Son únicas, no pueden repetirse en el archivo "a". :D
Y pueden no encontrarse en "b" (que es el NO MATCH), y si lo hacen solo deben de estar una vez en el archivo "b" (MATCH). :)
titantux
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2013-01-31 14:02 @626
Ubicación: Mexico, D.F.

Publicidad

Re: Búsqueda de cadenas en un archivo

Notapor explorer » 2013-02-02 23:03 @002

A ver... yo no he preguntado si "pueden" o "deben" :)

He preguntado si *realmente* están una sola vez en "a" o en "b". Lo digo porque tengo una idea para acelerar las búsquedas, y si resulta que en "a" o en "b" puede haber más de una coincidencia o más de una clave igual, pues no funcionará.

¿Probaste lo del index()?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Búsqueda de cadenas en un archivo

Notapor titantux » 2013-02-02 23:55 @038

¡¡ Ups !! Sí, sólo están una vez en "a" y sólo está una vez en "b". :oops:

El index() lo estoy probando y se está tardando más, ¡¡ya lleva 15 minutos!! :(

Y en ese tiempo solo lleva ¡¡un poco menos de la mitad del resultado!! :(
titantux
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2013-01-31 14:02 @626
Ubicación: Mexico, D.F.

Re: Búsqueda de cadenas en un archivo

Notapor explorer » 2013-02-03 08:35 @399

Bueno, pues sabiendo que son únicas, podemos simplificar el programa un poquito más :)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. ## Leemos el archivo "b" y nos quedamos con la parte interesante
  7. my %b;
  8.  
  9. open my $IN2, '<', $ARGV[1];
  10. while (<$IN2>) {
  11.     my $valor = (split /[|]/)[6];
  12.     $valor = substr $valor, 3, -2;
  13.     $b{$valor} = 1;
  14. }
  15. close $IN2;
  16.  
  17. ## Hacemos el bucle por el archivo "a"
  18. open my $IN1, '<', $ARGV[0];
  19. while (my $linea = <$IN1>) {
  20.     my @columna    = split /;\s/, $linea, 7;
  21.     my $calldetail = $columna[5] . '20' . $columna[0];
  22.     $calldetail    = substr $calldetail, 2;
  23.  
  24.     print
  25.         $b{$calldetail}                               # ¿Existe $calldetail en %b?
  26.         ? "SI MATCH -> $calldetail  ** $linea"        # sí
  27.         : "NO MATCH -> $calldetail  ** $linea"        # no
  28.         ;
  29. }
  30. close $IN1;
  31.  
  32. __END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
La parte del print() es igual a escribir esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     if ( $b{$calldetail} ) {                            # ¿Existe $calldetail en %b?
  2.         print "SI MATCH -> $calldetail  ** $linea";
  3.     }
  4.     else {
  5.         print "NO MATCH -> $calldetail  ** $linea";
  6.     }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
solo que está un poco más condensada (usando el operador ternario '?:')
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Búsqueda de cadenas en un archivo

Notapor titantux » 2013-02-04 21:07 @921

¡¡¡Mmmh, wow,interesante!! la velocidad de Perl, realmente se nota aquí.

real 0m29.455s
user 0m26.526s
sys 0m1.232s


La clave es: ¡¡sí usar el hash!!!, ¡¡tal como dice la teoría!! :shock:

:idea: Entonces, se estaba demorando porque, tardaba en encontrar la clave en la cadena de mayor longitud. Ahora que la clave y la cadena son de la misma longitud... ¡¡zaz!!!.. ¡¡velocidad luz!! 8)

Nota: No había notado, el poder de la función "substr", hasta ahora. :twisted:
¡Gracias, explorer!
titantux
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2013-01-31 14:02 @626
Ubicación: Mexico, D.F.

Re: Búsqueda de cadenas en un archivo

Notapor explorer » 2013-02-05 05:29 @270

Pues el caso es que aún se puede acelerar un poco más...

Si en el archivo "b", todas las líneas tienen la misma longitud, no necesitamos el split() de la línea 11, y con el substr() de la línea siguiente sería suficiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my $valor = substr $_, 31, 24;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y en el archivo "a", si todas las líneas tienen la misma longitud, estamos en la misma situación: quitamos las líneas 20 y 22 y modificamos la 21 así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my $calldetail = substr($linea, 31, 10) . '20' . substr($linea, 0, 12);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ganamos unas milésimas más :)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Anterior

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 13 invitados