Página 1 de 1

Script en Perl que lee el nombre de un archivo

NotaPublicado: 2012-08-09 10:45 @489
por rsanchez8409
Hola,

Soy nuevo en Perl, y estoy tratando de crear un script .pl que haga lo siguiente:

Tengo un archivo pdf con la siguiente estructura en el nombre del archivo:
AAA_BBB_CCC_DDD_EEE.pdf

Necesito que el script genere otro archivo con otra extensión, por ejemplo txt, y que dentro muestre el nombre del archivo como si fueran parámetros, así:

@@TEXT01: AAA
@@TEXTO2: BBB
@@TEXTO3: CCC
@@TEXTO4: DDD
@@TEXTO5: EEE


y que ese nuevo archivo se llame AAA_BBB_CCC_DDD_EEE.txt

Alguien me puede ayudar para ver cómo puedo empezar, porque no sé cómo hacer...

Gracias

Re: Script en Perl que lee el nombre de un archivo

NotaPublicado: 2012-08-09 12:01 @542
por explorer
Bienvenido a los foros de Perl en Español, rsanchez8409.

Es un problema sencillo... debes usar split() para separar los campos, y luego podrías usar una expresión regular para quitar la extensión del primer archivo y luego concatenar la segunda extensión. Abrir el archivo, escribir todos los campos con ese formato, cerrar, y salir.

¿Tienes hecho algo?

Re: Script en Perl que lee el nombre de un archivo

NotaPublicado: 2012-08-09 12:45 @573
por rsanchez8409
Hola, explorer.

Hasta ahora estoy comenzando con Perl, entonces ya había visto el split() y había hecho algo como esto:

'{split("_"); print "@@TEXTO1:"a[1] "\n@@TEXTO2:" a[2] "\n@@TEXTO3:" a[3] "\n@@TEXTO4:" a[0] "\n@@TEXTO5:" a[5] "}'

Pero no tengo claro cómo crear el resto del código como usted me dice... Si me pudiera mostrar un poco cómo le agradecería mucho.

Re: Script en Perl que lee el nombre de un archivo

NotaPublicado: 2012-08-09 12:46 @573
por MARKO
Bienvenido man, te pongo una solución a tu problema con un extra que es el manejo gráfico gracias a Tkx.

en la función "analizar_click" está lo que te interesa.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use Tkx;
  4.  
  5. system ("cls");
  6. #########
  7. my $archivo;
  8. #########
  9.  
  10. #####lementos que componen la ventana y manejo geometrico de la misma.
  11.  
  12. my $forma = Tkx::widget->new(".");
  13.  
  14. $forma->g_wm_title("Archivos PDF");
  15.  
  16. $forma->new_ttk__label(-text => "Archivo")->g_grid(-column => 2, -row => 1);
  17.  
  18. $forma->new_ttk__button(-text=>"Buscar",
  19.                 -command => sub{buscar_click()})->g_grid(-column=> 1, -row=> 2);
  20.  
  21. $forma->new_ttk__entry(-width => 65,-textvariable =>\$archivo)-> g_grid(-column=>2, -row =>2);
  22.  
  23. $forma->new_ttk__button(-text => "Analizar",
  24.                 -command => sub{analizar_click()})->g_grid(-column=>1, -row =>3);
  25.                
  26. $forma->new_ttk__button(-text => "Salir",
  27.                 -command => sub{$forma->g_destroy()})->g_grid(-column=>3, -row=>3);
  28.  
  29. Tkx::MainLoop;
  30. #####################################################################################
  31.  
  32. sub buscar_click{
  33.         $archivo = Tkx::tk___getOpenFile(-filetypes=>[['Archivos Pdf', '*.pdf']],     #dirección del archivo.
  34.         -initialdir=>'C:\\');
  35. }
  36.  
  37. sub analizar_click #####################################esto es lo que interesa del problema
  38. {
  39.         my @vector = split ('/',$archivo);
  40.         $vector[-1]=~ s/.pdf//;
  41.         @vector=split ('_',$vector[-1]);
  42.        
  43.         $archivo =~ s/.pdf/.txt/;
  44.         open (ARCHIVO,">>".$archivo);
  45.         my $contador = 1;
  46.         foreach(@vector){
  47.                 print ARCHIVO "\@\@TEXTO".$contador.":".$_."\n";
  48.                 $contador++;
  49.         }
  50.         close (ARCHIVO);
  51. }      
  52.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


espero que te sirva

saludos.

Re: Script en Perl que lee el nombre de un archivo

NotaPublicado: 2012-08-09 15:22 @682
por rsanchez8409
Gracias, MARKO, perdón la preguntadera y la inexperiencia... pero quiero entender bien la estructura...

Voy a probar primero con este código tal cual se ve abajo, sin la parte gráfica...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use strict;
  3.  
  4. system ("cls");
  5. #########
  6. my $archivo;
  7. #########
  8.  
  9.  
  10. sub analizar_click #####################################esto es lo que interesa del problema
  11. {
  12.         my @vector = split ('/',$archivo);
  13.         $vector[-1]=~ s/.pdf//;
  14.         @vector=split ('_',$vector[-1]);
  15.        
  16.         $archivo =~ s/.pdf/.txt/;
  17.         open (ARCHIVO,">>".$archivo);
  18.         my $contador = 1;
  19.         foreach(@vector){
  20.                 print ARCHIVO "\@\@TEXTO".$contador.":".$_."\n";
  21.                 $contador++;
  22.         }
  23.         close (ARCHIVO);
  24. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Pero no sé si está para Windows o para Linux... Lo probé en mi RedHat con ./pdf_hdr.pl, pero mostró que no reconoce (cls)...

Re: Script en Perl que lee el nombre de un archivo

NotaPublicado: 2012-08-09 15:47 @699
por explorer
En efecto, el comando cls suelo existir solamente en Windows.

Teniendo en cuenta que su única misión es limpiar la pantalla de la emulación de la línea de comandos, puedes sustituirlo por clear, que hace esa función en los Linux modernos, limpiando el contenido de las terminales de línea de comandos.

O, más sencillo, quitar esa línea.

Re: Script en Perl que lee el nombre de un archivo

NotaPublicado: 2012-08-09 16:12 @716
por MARKO
Bien, bien.

En Windows la línea system (cls) sirve para limpiar la pantalla, puedes quitarla y probar así.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. #########
  3. my $archivo;         #dirección del archivos pdf    "C:/directorio/directorio2/directorioX/nombredearchivo.pdf"
  4. #########
  5.         my @vector = split ('/',$archivo); # quitas las diagonales y los directorios van a @vector.
  6.         $vector[-1]=~ s/.pdf//;            # le quita el .pdf al nombre del archivo que está en la ultima posición.
  7.         @vector=split ('_',$vector[-1]);   # @vector se convierte en el nombre del archivo sin "_"
  8.        
  9.         $archivo =~ s/.pdf/.txt/;          #al nombre del archivo le quita el .pdf y le pone .txt
  10.         open (ARCHIVO,">>".$archivo);      #creas un archivo (.txt) con el nombre deseado
  11.         my $contador = 1;
  12.         foreach(@vector){
  13.                 print ARCHIVO "\@\@TEXTO".$contador.":".$_."\n"; #$_ tiene el contenido de cada posición de @vector en cada iteración
  14.                 $contador++;
  15.         }
  16.         close (ARCHIVO);  #Cierra el archivo.
  17.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


perdón la preguntadera y la inexperiencia... pero quiero entender bien la estructura...

para eso está el foro, man, no te preocupes ;)

Éxitos.

Re: Script en Perl que lee el nombre de un archivo

NotaPublicado: 2012-08-10 03:21 @181
por explorer
Esta es mi versión:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.10;
  3. use autodie;
  4.  
  5. my $archivo = 'AAA_BBB_CCC_DDD_EEE.pdf';
  6.  
  7. my($nombre, undef) = split /[.]/, $archivo;
  8. my @campos         = split /[_]/, $nombre;
  9.  
  10. my $prefijo = 'TEXTO1';
  11.  
  12. open my $SALIDA, q[>], "$nombre.txt";
  13.  
  14. for my $campo (@campos) {
  15.     say $SALIDA "\@\@$prefijo: $campo";
  16.     $prefijo++;                           # ¡Magia!
  17. }
  18.  
  19. close $SALIDA;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: Script en Perl que lee el nombre de un archivo

NotaPublicado: 2012-08-14 10:38 @484
por rsanchez8409
Vale, señores, entendí las dos soluciones propuestas.

¡Gracias por la ayuda!