• Publicidad

Búsqueda de clusters en varios ficheros

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

Búsqueda de clusters en varios ficheros

Notapor jorcaes » 2007-09-23 16:20 @722

Hola, dispongo de un listado de clusters (cadenas de 3 a 8 palabras) y me gustaría buscar el número de ocurrencias de dichos clusters en varios ficheros de texto contenidos en un directorio.

De momento tengo el siguiente código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $nombre_fichero ( <C:\\MI_DIRECTORIO\\*.txt> ){
       
        open(TEXTO, $nombre_fichero);
        @lineas=<TEXTO>;
        close(TEXTO);
        print @lineas;
               
        while($cluster=<DATA>){
                chomp($cluster);
                $numero_de_veces=()=@lineas=~/$cluster/misg;
                print "$cluster: $nombre_fichero: $numero_de_veces\n";
        }
}
#LISTADO DE CLUSTERS        
__DATA__
IN ORDER TO
THE EFFECT OF
THE NUMBER OF
DUE TO THE
THE END OF
...
 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Pero tan sólo me buscar los clusters para el primero de los ficheros y no encuentra ninguna ocurrencia a pesar de que si que existen. ¿Qué estoy haciendo mal?

Por cierto, en otro hilo pregunto cómo puedo dividir un fichero de texto en 5 secciones diferentes (número total de palabras/5).

Saludo y gracias!
jorcaes
Perlero nuevo
Perlero nuevo
 
Mensajes: 26
Registrado: 2006-07-12 02:35 @149

Publicidad

Notapor explorer » 2007-09-23 17:06 @754

* Has leído el fichero como un conjunto de @lineas, y no se puede aplicar una expresión regular a un array (@lineas=~/$cluster/misg;) (Ahora mismo no me acuerdo qué es lo que hace en realidad).

* Después de procesar todos los cluster a un fichero, el apuntador DATA está al final del programa. Necesitas reposicionarlo al comienzo de la sección DATA otra vez. Eso se hace con un seek().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor jorcaes » 2007-09-24 15:35 @691

1) En esta línea

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$numero_de_veces=()=@lineas=~/$cluster/misg;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Se busca en @lineas el $cluster, sin importar las mayusculas y minusculas (/i), en un texto que tienen varias líneas (/ms) y todas las veces posibles (/g). Y devuelve el $numero_de_veces que aparece.

Si no se puede realizar en un array ¿cómo debería almacenar todo el texto en qué variable para poder buscar strings en dicho texto?

2) Estoy probando a ejecutar el seek antes de finalizar el while

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while($cluster=<DATA>){
                chomp($cluster);
                $numero_de_veces=()=@lineas=~/$cluster/misg;
                print "$cluster: $nombre_fichero: $numero_de_veces\n";
                seek(DATA, 0,0);
        }
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


pero se me queda colgado, no consigo saber cómo ubicar el puntero DATA al inicio de la sección DATA.
jorcaes
Perlero nuevo
Perlero nuevo
 
Mensajes: 26
Registrado: 2006-07-12 02:35 @149

Notapor explorer » 2007-09-24 19:03 @835

Que se usen las opciones /ms no significa que se puedan aplicar a todos los elementos de un array.

Una expresión regular solo se puede aplicar a un elemento cada vez.

Tienes dos opciones: o metes todas las líneas en un escalar, como se muestra en el otro hilo, o aplicas la expresión regular a cada línea, en un bucle. Desde luego, es mejor la primera solución, para evitar los casos en los que puedan existir cluster partidos entre líneas.

Para unir las líneas tienes varias opciones. Una es la comentada en el otro hilo, la de modificar el valor de $/, y la otra es la de hacer un join:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$lineas = join '', <TEXTO>;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Para el tema del seek, tienes razón: si lo colocas a la posición 0, va al principio del programa. Una forma de solventarlo es preguntar primero qué posición tiene DATA al arrancar el programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$data_pos = tell DATA;

while ( <DATA> ) {

}

seek DATA, $data_pos, 0;

while ( <DATA> ) {

}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 0 invitados