Página 1 de 2

Extraer de cadena de caracteres

NotaPublicado: 2012-06-26 10:10 @465
por aindergm
Hola buenas,

Tengo una cadena de caracteres que es una dirección (path) de la cual quiero extraer dos datos. La cadena de caracteres es la siguiente:

C:\Users\Gordoa\Documents\UNI\4ºCurso\ProyectoFinGrado\server\public_html\AndroidDataMining\iLogand\ID-357841036752224\com.android.deskclock_3404.out

Los dos datos que quiero extraer son:
-El número que va seguido del ID-
-Y el com.android.deskClock

Hay que decir que el número siempre es del mismo tamaño, pero el segundo dato que quiero extraer puede tener diferente longitud.

¡Gracias de antemano!

Re: Extraer de cadena de caracteres

NotaPublicado: 2012-06-26 10:47 @491
por explorer
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $cadena = 'C:\Users\Gordoa\Documents\UNI\4ºCurso\ProyectoFinGrado\server\public_html\AndroidDataMining\iLogand\ID-357841036752224\com.android.deskclock_3404.out';

my($ID, $out) = $cadena =~ m/\\ID-(\d+)\\(.+?)_/;

print "[$ID][$out]\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Usamos 'ID-' y el '_' como anclas para saber la posición y tamaño de lo que queremos capturar.
Bueno, un poco también los '\'.

Re: Extraer de cadena de caracteres

NotaPublicado: 2012-06-26 11:00 @500
por aindergm
Gracias por la ayuda, pero esto que has puesto solo sirve en caso de que la cadena de caracteres esté entre comillas simples ('xxxx'), pero en mi caso la cadena de caracteres me llega con comillas dobles ("xxxx").

Gracias.

Re: Extraer de cadena de caracteres

NotaPublicado: 2012-06-26 11:54 @538
por explorer
Yo he puesto comillas simples para poder escribir la cadena de forma literal, debido a la presencia de las barras diagonales inversas, pero no entiendo lo que quieres decir con "me llega".

Es mejor que pongas el trozo de código que no te funciona, o aquel en donde lees la cadena desde el exterior.

Re: Extraer de cadena de caracteres

NotaPublicado: 2012-06-26 13:43 @613
por aindergm
Yo lo que hago es pasar una dirección de un archivo Perl a otro de la siguiente manera:

my $response = `perl $dirPerl/perlPrueba.pl $dirComplete`;

pero claro la dirección esa se guarda en una cadena de caracteres de la siguiente manera:

$dirComplete="$dirFiles/$filesElement";

Y si esto se hace con comillas simples no lo guarda bien, es decir guarda lo que hay escrito, y no los valores que tienen esas cadenas.

Y el código del archivo perlPrueba.pl es el siguiente:

$dirData = $ARGV[0];
my($ID, $out) = $dirData =~ m/\\ID-(\d+)\\(.+?)_/;
print "[$ID][$out]\n";


Gracias

Re: Extraer de cadena de caracteres

NotaPublicado: 2012-06-26 16:49 @742
por explorer
aindergm escribiste:Yo lo que hago es pasar una dirección de un archivo Perl a otro de la siguiente manera:

my $response = `perl $dirPerl/perlPrueba.pl $dirComplete`;

pero claro la dirección esa se guarda en una cadena de caracteres de la siguiente manera:

$dirComplete="$dirFiles/$filesElement";

Y si esto se hace con comillas simples no lo guarda bien, es decir guarda lo que hay escrito, y no los valores que tienen esas cadenas.
Pero es que de esto no estamos hablando, ¿no? Solo estamos hablando de extraer datos de una variable escalar que contiene un texto como el que indicabas antes.

Tanto las comillas invertidas como las dobles, en estos dos ejemplos, solo muestran la forma de interpolar las variables que hay dentro de esas comillas. Pero extraer los datos es otra cosa.

aindergm escribiste:Y el código del archivo perlPrueba.pl es el siguiente:

$dirData = $ARGV[0];
my($ID, $out) = $dirData =~ m/\\ID-(\d+)\\(.+?)_/;
print "[$ID][$out]\n";


Pero, ¿qué contiene $dirData? Si es el nombre de un archivo, mal vamos... porque no estamos leyendo el archivo. Solo estás aplicando la expresión regular al nombre del archivo, y no a su contenido.

Re: Extraer de cadena de caracteres

NotaPublicado: 2012-06-27 03:23 @182
por aindergm
Te dejo el código de los dos ficheros Perl que tengo:

Principal.pl:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use File::Find;                        #Find File
  4.  
  5. $dirPerl        = 'C:/Users/Gordoa/Documents/UNI/4ºCurso/ProyectoFinGrado/Perl/archivosPerl';
  6. $dirDirectories = 'C:/Users/Gordoa/Desktop/CarpetaParaBorrar';
  7.  
  8. find( \&find_directories, $dirDirectories );
  9.  
  10. sleep(30);
  11.  
  12. sub find_directories {
  13.     my $directoriesElement = $_;
  14.  
  15.     if ( $directoriesElement =~ /ID-/ ) {
  16.         $dirFiles = "$dirDirectories/$directoriesElement";
  17.         find( \&find_files, $dirFiles );
  18.     }
  19. }
  20.  
  21. sub find_files {
  22.     my $filesElement = $_;
  23.     $dirComplete = "$dirFiles/$filesElement";
  24.     if ( $filesElement =~ /.out/ ) {
  25.         my $response = `perl $dirPerl/perlPrueba.pl $dirComplete`;
  26.     }
  27. }
  28.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


perlPrueba.pl:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. $dirData = $ARGV[0];
  4.  
  5. my($ID, $out) = $dirData =~ m/\\ID-(\d+)\\(.+?)_/;
  6.  
  7. print "[$ID][$out]\n";
  8.  
  9. sleep(5);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Esto es lo que hago.

Gracias

Re: Extraer de cadena de caracteres

NotaPublicado: 2012-06-27 06:24 @308
por explorer
Cosas que he visto:

  • usas un File::Find para buscar rutas/archivos que contengan 'ID-' en el nombre, en la línea 15. Si es así, agregas luego la ruta a $dirDirectories (línea 16), y comienzas una nueva búsqueda desde allí. ¿Qué es lo que contiene 'CarpetaParaBorrar/'? ¿Solo archivos o también tiene subdirectorios? Si solo fueran archivos, te podrías ahorrar el primer File::Find.
  • cuidado con la línea 24: el punto que hay dentro de la expresión regular no es un punto literal, sino que es un comodín, así que la expresión regular está buscando por la presencia de 'out' en cualquier parte de $filesElement, precedido por un carácter cualquiera.
  • la llamada externa en la línea 25 no es necesaria: lo que hace perlPrueba.pl es lo suficientemente pequeño como para meterlo ahí mismo
  • el sleep(30) no es necesario... es la última instrucción del programa... ¿Para qué esperar al final a que termine?
  • a perlPrueba.pl le pasas como argumento una ruta a un archivo. La expresión regular de la línea 5 busca el ID y lo que sigue, y los saca en pantalla.

Me parece correcto lo que hace, pero creo que se puede simplificar mucho. Para saberlo, habría que saber la estructura del árbol de directorios que quieres recorrer, y las operaciones que quieres realizar. Por lo que se deduce del código, estás buscando unos archivos en una parte, para luego buscar otros directorios en otra parte, coincidentes con el ID. ¿Es así?

En cuanto a la preocupación por las comillas dobles o simples: solo hay que fijarse en la línea de la expresión regular, que aplica un patrón a una variable escalar. Perl no sabe cómo ha sido construida antes, solo sabe que tiene que hacer una búsqueda de patrón en el valor que contiene. Ya es trabajo nuestro, antes, el construir ese valor, bien mediante comillas simples (si sabemos el valor literal que queremos meter) o bien con comillas dobles (por que queramos que las comillas interpolen valores de otras variables).

Re: Extraer de cadena de caracteres

NotaPublicado: 2012-06-27 06:54 @329
por aindergm
Te voy respondiendo:

-En el directorio 'CarpetaParaBorrar/' hay subdirectorios que contienen 'ID-' los cuales quiero diferenciar, y luego ver los ficheros que hay dentro de ese subdirectorio.

-En cuanto a la llamada externa de la línea 25, ahora solo son 5 líneas, pero en realidad es un fichero Perl de unas 300 líneas, lo que pasa es que tengo puesto otro fichero para hacer pruebas, por eso se llama 'perlPrueba.pl', ¡je,je!

-El sleep(30) es para ver los print() que hago en el otro fichero, pero es temporal, cuando acabe lo quitaré.

Lo que quiero hacer es buscar unos directorios tales como 'ID-357841036752224' y dentro de esos directorios buscar unos ficheros tales como 'com.android.launcher_280.out'.

Luego pasar la ruta entera (incluyendo el subdirectorio y el nombre del fichero) a otro Perl para recoger información de ese fichero. Pero necesito recoger el número que hay después de 'ID-', y el nombre del fichero hasta la '_', es decir en este caso:

ID:357841036752224
nombre fichero:com.android.launcher

Espero haberme explicado correctamente.

Gracias por la ayuda

Re: Extraer de cadena de caracteres

NotaPublicado: 2012-06-27 09:09 @423
por explorer
aindergm escribiste:-El sleep(30) es para ver los print() que hago en el otro fichero, pero es temporal, cuando acabe lo quitaré.
Pero si el resultado sale en la terminal... no necesitas esperar... En cuanto termina el programa puedes subir por las líneas que ha sacado, usando el ratón, por ejemplo, pulsando en las barras de desplazamiento de la ventana de terminal.

O entubar la salida del programa hacia less, y de esa manera, tienes control total sobre la salida:

perl Principal.pl | less