• Publicidad

Buscador de archivos para traducir

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

Re: Buscador de archivos para traducir

Notapor explorer » 2010-02-10 07:28 @353

Esta es mi versión, pero no he probado a ver si funciona (tengo unos días muy vagos).
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #
  3.  
  4. ### Pragmas de funcionamiento
  5. use strict;
  6. use warnings;
  7. use diagnostics;
  8.  
  9.  
  10. ### Constantes
  11. my $DICCIONARIO = '/home/explorer/Documents/Desarrollo/diccionario_latex.dat';
  12.  
  13.  
  14. ### Variables
  15. my $directorio;                         # Guardará el directorio a analizar
  16. my %diccionario;                        # Diccionario Latex -> Español
  17.  
  18.  
  19. ### Argumentos
  20. if (@ARGV) {                            # Si el usuario nos lo ha pasado directamente
  21.     $directorio = $ARGV[0];
  22. }
  23. else {                                  # Si no, se lo preguntamos
  24.     print 'Introduzca el nombre del directorio: ';
  25.     $directorio = <>;
  26.     chomp $directorio;
  27. }
  28.  
  29. -d $directorio                          # ¿Es un directorio de verdad?
  30.     or die "ERROR: No encuentro el directorio [$directorio]\n";
  31.  
  32. chdir $directorio
  33.     or die "ERROR: No puedo entrar en ese directorio: $!\n";
  34.  
  35.  
  36. ### Lectura del diccionario
  37. open DICC, "<$DICCIONARIO")             # Leer el diccionario
  38.     or die "ERROR: No puedo abrir el diccionario: $!\n";
  39.  
  40. while (<DICC>) {
  41.     chomp;
  42.     my ($latex, $spanish) = split q[,];
  43.  
  44.     $diccionario{$latex} = $spanish;
  45. }
  46.  
  47. close DICC;
  48.  
  49.  
  50. ### Programa
  51. for my $fichero (<*>) {                 # Para todos los ficheros del directorio...
  52.     my $fichero_traducido = traduce($fichero);
  53.     print "Traducido:\n$fichero_traducido\n";
  54. }
  55.  
  56.  
  57. ### Subrutinas
  58. sub traduce {                           # Traduce un fichero
  59.  
  60.     # Entrada
  61.     my $fichero_a_traducir = $_[0];
  62.  
  63.     # Salida
  64.     my $fichero_traducido;
  65.  
  66.  
  67.     open ARCHIVO, "<$fichero_a_traducir")
  68.         or warn "ERROR: No puedo abrir $fichero_a_traducir: $!\n";
  69.  
  70.     my $numero_lineas;
  71.     my $cambios;
  72.     while (my $linea = <ARCHIVO>) {     # Para cada línea
  73.         $numero_lineas++;
  74.                                         # Para todo el diccionario
  75.         while (my ($latex, $espanol) = each %diccionario) {
  76.             # hacemos la traducción y llevamos la cuenta
  77.             $cambios += $linea =~ s/$latex/$espanol/g;
  78.         }
  79.  
  80.         $fichero_traducido .= $linea;
  81.     }
  82.  
  83.     close ARCHIVO;
  84.  
  85.     print "El archivo $fichero_a_traducir tiene $numero_lineas líneas, con $cambios cambios realizados\n";
  86.  
  87.     return $fichero_traducido;
  88. }
  89.  
  90. __END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Al menos, para que veas la idea de cómo organizar la lectura de ficheros y el uso de una subrutina.
Última edición por explorer el 2010-02-10 15:01 @667, editado 3 veces en total
Razón: Errores en el código
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

Publicidad

Re: Buscador de archivos para traducir

Notapor charmin » 2010-02-10 17:38 @777

Hola, ¿cómo estás? Como le decía ya tengo el script que hace la traducción de los archivos, el único inconveniente es que me guarda en la variable @archivo, las traducciones de los n archivos anteriores, y en el archivo que me pasaste haciéndole unas modificaciones al momento de correr el directorio me dice que no existe, y el hecho es que le pongo la ruta cual debe, en sí de este script:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #print "Introdusca el nombre del directorio\n";         #se introduce el listado de archivos a abrir.
  2.  
  3. $direccion ="directorio.dat";                                    
  4.  
  5. open (DIRECTORIO,"<$direccion");                        #se abre el archivo con el listado de los archivos a traducir
  6.  
  7. while (<DIRECTORIO>){                                   #ciclo para separar el nombre de los archivos
  8.  
  9.         chomp;
  10.  
  11.         (@e)=split q[,];
  12. }
  13. close (DIRECTORIO);
  14.  
  15.  
  16. $dic  = "diccionario.dat";                              # diccionario normal->latex
  17.  
  18. open(DIC,"$dic");                                       # se abre diccionario
  19.  
  20. while (<DIC>) {                                         # ciclo para separar las variables del diccionario
  21.        
  22.         chomp;
  23.  
  24.         ($b,$s) = split q[,];
  25.  
  26.         $dicc{$b} = $s;                                     # lo guardamos en un hash
  27. }
  28.  
  29. close (DIC);
  30. for  $archivo (@e) {   # Para todos los ficheros del directorio...
  31.    
  32.          $archivo = traduce(@archivo);
  33.        
  34.         print "Traducido:\n@archivo\n";
  35. }
  36.  
  37. sub traduce{                                            # se inicia la subrutina
  38.  
  39. open(ARCHIVO,"<$archivo");                              # se abre el archivo a traducir
  40.  
  41. while (<ARCHIVO>) {
  42.  
  43.         $count++ ;                                          # contador de las líneas del archivo
  44.  
  45.         push @archivo, $_;                                  # se guarda en el array del archivo
  46.  
  47. }
  48.  
  49. $count2++;                                              #contador del numero de archivo
  50.  
  51. print "\nEl archivo $count2 tiene $count líneas\n";
  52.  
  53. $n_linea = 1;                                           # número de línea
  54.  
  55. for $linea (@archivo) {
  56.  
  57.         $cambios = 0;
  58.  
  59.         for $b (keys %dicc) {                                # para todas las claves del diccionario
  60.  
  61.         $cambios += $linea =~ s/$b/$dicc{$b}/g;          # hacemos la traducción y llevamos la cuenta
  62.  
  63.         }
  64.  
  65.         open(SALIDA,">>salida.dat");
  66.  
  67.         print SALIDA "\n Archivo: $archivo\n \nLinea $n_linea se realizaron $cambios cambios.\n";
  68.  
  69.         chomp;
  70.  
  71.         $n_linea++;
  72.  
  73.         close(SALIDA);
  74.  
  75.         }
  76.  
  77.        return $archivo;
  78. close(ARCHIVO);
  79. }      
  80.  
  81. __END__
  82.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Solo quiero saber cómo hacer que no se me repita la información, es decir, me sale lo siguiente
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
El archivo 1 tiene 2 líneas
Traducido:
\[ \ frac{x^2}{x^2 + y^2} + \ frac12 +
 \frac1{1 + \ sqrt{ \frac{21}3 } \]

El archivo 2 tiene 5 líneas    <-----este archivo tiene solo 3 lineas y se le agregan las dos del anterior lo que me da las 5 lineas.

Traducido:
\[ \ frac{x^2}{x^2 + y^2} + \ frac12 +
 \frac1{1 + \ sqrt{ \frac{21}3 } \]
 \left( \frac{ 1 }{\sqrt{\frac{x+1}{x-2}}} \right)
 R_{\mu\nu} - \frac12 g_{\mu\nu} R = \kappa T_{\mu\nu}
 \exp(x) = \mathrm {e}^x = \sum_{n=0}^\inftyxy \frac{x^n}{n!}


El archivo 3 tiene 9 líneas   <---- asi en este se suman los 5 anteriores y se anexan a este
Traducido:
\[ \ frac{x^2}{x^2 + y^2} + \ frac12 +
 \frac1{1 + \ sqrt{ \frac{21}3 } \]
 \left( \frac{ 1 }{\sqrt{\frac{x+1}{x-2}}} \right)
 R_{\mu\nu} - \frac12 g_{\mu\nu} R = \kappa T_{\mu\nu}
 \exp(x) = \mathrm {e}^x = \sum_{n=0}^\inftyxy \frac{x^n}{n!}
 \frac{\sqrt a}{a+b} + \sqrt{ \frac{x+5}{x-5} }
 \sqrt{ 1 + \sqrt{ 1 + \sqrt{ 1 + \sqrt{ 1 +
 \sqrt{ 1 + \sqrt{ 1 + \sqrt{ 1 + x}}}}}}}
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

entonces, todo eso según yo como lo dije se guarda en @archivo, y no sé cómo cerrar el ciclo y que me imprima nada más la salida de un archivo, se cierre y siga con el siguiente archivo. Y lo de tu programa se me hizo interesante pero como lo comente no me acepta el directorio. De antemano por todo mil gracias.
charmin
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-02-03 14:31 @646

Re: Buscador de archivos para traducir

Notapor explorer » 2010-02-10 17:48 @783

No estás inicializando la variable @archivo. Debes agregar una línea como

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @archivo = ();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y en cuanto al programa, si sale el error de que el directorio no existe, es que, efectivamente, desde donde se está ejecutando el programa, el directorio indicado no existe (o ha sido mal escrito). A mí si que me funciona.
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

Re: Buscador de archivos para traducir

Notapor charmin » 2010-02-10 18:06 @796

Ahora sí, mi explorer, un master. Estuve hasta las 3 de la mañana tratando de resolver este problema y sin nada que se me ocurriera. Muchas gracias, amigo, y que tengas un excelente día.
charmin
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-02-03 14:31 @646

Mejorar programa con File::Find

Notapor charmin » 2010-02-12 03:35 @191

Hola, ¿cómo están? Espero y bien. Bueno, este es mi dilema: tengo el siguiente código
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. ### Constantes
  2. my $DICCIONARIO = '/home/didier/lenguajes/diccionario.dat';
  3.  
  4.  
  5. ### Variables
  6. my $directorio;                         # Guardará el directorio a analizar
  7. my %diccionario;                        # Diccionario Latex -> Español
  8. my $cambios;
  9. ### Argumentos
  10.  
  11.  
  12. if (@ARGV) {                            # Si el usuario nos lo ha pasado directamente
  13.     $directorio = $ARGV[0];
  14. }
  15. else {                                  # Si no, se lo preguntamos
  16.     print 'Introduzca el nombre del directorio: ';
  17.     $directorio = <>;
  18.     chomp $directorio;
  19. }
  20.  
  21. -d $directorio                          # ¿Es un directorio de verdad?
  22.     or die "ERROR: No encuentro el directorio [$directorio]\n";
  23.  
  24. chdir $directorio
  25.     or die "ERROR: No puedo entrar en ese directorio: $!\n";
  26.  print $directorio;
  27. ### Lectura del diccionario
  28. open (DICC, "<$DICCIONARIO")             # Leer el diccionario
  29.     or die "ERROR: No puedo abrir el diccionario: $!\n";
  30.  
  31. while (<DICC>) {
  32.     chomp;
  33.     my ($latex, $spanish) = split q[,];
  34.  
  35.     $diccionario{$latex} = $spanish;
  36. }
  37.  
  38. close DICC;
  39.  
  40.  
  41. ### Programa
  42. for my $fichero (<*>) {                 # Para todos los ficheros del directorio...
  43.     my $fichero_traducido = traduce($fichero);
  44.     print "Traducido:\n$fichero_traducido\n";
  45. }
  46.  
  47.  
  48. ### Subrutinas
  49. sub traduce {                           # Traduce un fichero
  50.  
  51.     # Entrada
  52.     my $fichero_a_traducir = $_[0];
  53.  
  54.     # Salida
  55.     my $fichero_traducido;
  56.  
  57.  
  58.     open (ARCHIVO, "<$fichero_a_traducir")
  59.         or warn "ERROR: No puedo abrir $fichero_a_traducir: $!\n";
  60.  
  61.     my $numero_lineas;
  62.     my $cambios;
  63.     while (my $linea = <ARCHIVO>) {     # Para cada línea
  64.         $numero_lineas++;
  65.                                         # Para todo el diccionario
  66.         while (my ($latex, $spanish) = each %diccionario) {
  67.             # hacemos la traducción y llevamos la cuenta
  68.             $cambios += $linea =~ s/$latex/$spanish/g;
  69.         }
  70.  
  71.         $fichero_traducido .= $linea;
  72.     }
  73.  
  74.     close ARCHIVO;
  75.  
  76.     print "El archivo $fichero_a_traducir tiene $numero_lineas líneas, con $cambios cambios realizados\n";
  77.  
  78.     return $fichero_traducido;
  79. }
  80.  
  81. __END__
  82.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Este programa me busca todos los ficheros de un directorio y lo ejecuta. Lo que quiero que haga es que me busque un documento donde le indico una lista de archivos que quiero me ejecute y en que dirección en el cual están estos ficheros. Estuve jugando con la función File::Find, pero no pude. Ahora sí que es no más para mejorar este programa.
charmin
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-02-03 14:31 @646

Re: Buscador de archivos para traducir

Notapor explorer » 2010-02-12 05:55 @288

File::Find te sirve para buscar archivos por todos los niveles de subcarpetas de un determinado directorio.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use File::Find;

find(\&traduce, @directorios_a_buscar);

sub encontrado {
    # $File::Find::name guarda la ruta completa al fichero
    # ...
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Enséñanos el código que estás usando con File::Find, a ver si tenemos más pistas.
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

Re: Buscador de archivos para traducir

Notapor charmin » 2010-02-16 19:52 @869

Este es el código final del traductor éste. En éste pongo la ruta del directorio, por ejemplo /home/.../directorios/

Después pongo el nombre del archivo a buscar por ejemplo: directorio.dat.

En el archivo directorio.dat está el listado de documentos a traducir. El problema es que solo me lee si los archivos están en el mismo directorio del listado pero si existen carpetas o sub-carpetas donde puedan estar estos archivos no los lee. O no los encuentra. Le llamaré script 1:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. ### Argumentos
  2. if (@ARGV) {                            # Si el usuario nos lo ha pasado directamente
  3.     $directorio = $ARGV[0];
  4. }
  5. else {                                  # Si no, se lo preguntamos
  6.     print 'Introduzca el nombre del directorio: ';
  7.     $directorio = <>;
  8.     chomp $directorio;
  9. }
  10.  
  11. #buscador de archivos
  12. print "Introdusca el nombre del Documento con el listado de los archivos a traducir:";
  13.  
  14. $direccion = <STDIN>;
  15.  
  16. open (DATOS,"$direccion");
  17.  
  18. while (<DATOS>){                                        #ciclo para separar el nombre de los archivos
  19.  
  20.         chomp;
  21.  
  22.         (@e)=split q[,];
  23. }
  24.  
  25. close (DATOS);
  26.  
  27. $dic  = "diccionario.dat";                              # diccionario normal->latex
  28.  
  29. open(DIC,"$dic");                                       # se abre diccionario
  30.  
  31. while (<DIC>) {                                         # ciclo para separar las variables del diccionario
  32.  
  33.         chomp;
  34.  
  35.         ($b,$s) = split q[,];
  36.  
  37.         $dicc{$b} = $s;                                     # lo guardamos en un hash
  38. }
  39.  
  40. close (DIC);
  41.  
  42. for  $archivo (@e) {                                    # Para todos los ficheros del directorio...
  43.  
  44.         @archivo=();
  45.  
  46.         $archivo = traduce(@archivo);
  47.  
  48.         print "Traducido:\n@archivo\n";
  49.  
  50. }
  51.  
  52. sub traduce{                                            # se inicia la subrutina
  53.  
  54. open(ARCHIVO,"<$archivo");                              # se abre el archivo a traducir
  55.  
  56.         @archivo = ();
  57.  
  58.         $count=0;
  59.  
  60. while (<ARCHIVO>) {
  61.  
  62.         $count++ ;                                          # contador de las líneas del archivo
  63.  
  64.         push @archivo, $_;                                  # se guarda en el array del archivo
  65.  
  66. }
  67.  
  68. $count2++;                                              #contador del numero de archivo
  69.  
  70. print "\nEl archivo $count2 tiene $count líneas\n";
  71.  
  72. $n_linea = 1;                                           # número de línea
  73.  
  74. for $linea (@archivo) {
  75.  
  76.         $cambios = 0;
  77.  
  78.         for $b (keys %dicc) {                                # para todas las claves del diccionario
  79.  
  80.         $cambios += $linea =~ s/$b/$dicc{$b}/g;          # hacemos la traducción y llevamos la cuenta
  81.  
  82.         }
  83.  
  84.         open(SALIDA,">>salida.log");
  85.  
  86.         print SALIDA "En el Directorio $directorio \n\nEl Archivo: $archivo\n \nEn la linea $n_linea se realizaron $cambios cambios.\n\n";
  87.  
  88.         chomp;
  89.  
  90.         $n_linea++;
  91.  
  92.         close(SALIDA);
  93.  
  94.         }
  95.  
  96.        return $archivo;
  97.  
  98.        close(ARCHIVO);
  99. }
  100.  
  101. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


con el código que estuve jugando es el siguiente, al cual llamare script 2:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use File::Find;
  5.  
  6. my $dir = '/home/didier/lenguajes/directorios/';
  7.  
  8. find(\&imprimir_archivo_pl, $dir);
  9.  
  10. sub imprimir_archivo_pl{
  11. my $elemento = $_;
  12.  
  13. if(-f $elemento && $elemento =~ /\.dat$/){
  14. print "$File::Find::name\n";
  15. }
  16. }
  17.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El script 2 me encuentra todos los archivos con extensión ".dat" que se encuentren en todos los subdirectorios; lo que quisiera implementar sería que yo le dé la dirección donde se encuentra un archivo directorio.dat, donde tengo el listado de todos los archivos que quiero traducir; ya que tenga identificados qué archivos quiero que busque, utilice el script 2 y me busque los archivos con los nombres de los archivos que se encuentran en este listado y los traduzca utilizando el script 1. Esa es más o menos la mejora que quiero hacer.
charmin
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-02-03 14:31 @646

Re: Buscador de archivos para traducir

Notapor explorer » 2010-02-16 20:15 @885

Bueno, pues entonces el problema se reduce a saber si los ficheros/directorios que nos entregan en el listado, están con ruta relativa o absoluta.

En Perl tienes unos cuantos módulos para manejar esos casos.
* File::Basename te servirá descomponer las partes de una ruta

* File::Spec te servirá para componer las nuevas rutas, de forma compatible según el sistema operativo donde te encuentres.

En caso de que ocurran errores, consulta el valor de la variable $! que guarda el mensaje del último error ocurrido (más información en perlvar). Si te fijas en mis programas, yo siempre hago un die() en caso de que no pueda abrir un fichero, sacando a continuación el valor de $1 para saber porqué.
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

Anterior

Volver a Básico

¿Quién está conectado?

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

cron