• Publicidad

Insertar registros de un archivo a otro

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

Insertar registros de un archivo a otro

Notapor charlygarza » 2013-05-30 10:17 @470

Necesito ayuda. Lo que busco hacer es lo siguiente:
  • Leer el archivo
  • Seleccionar el tipo de actividad (esta puede ser, concierto, fútbol, baloncesto, desfile, cine
  • Crear un archivo a partir del nombre de la actividad
  • Almacenar ahí los registros correspondientes a esa actividad
  • Imprimir el nombre del archivo y los registros correspondientes a cada archivo
Tendría que crear en este caso 5 archivos, cada uno a partir del tipo de actividad y almacenar ahí los registros relacionados con esa actividad.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. open( IN, "+<D:/etc/ticketsven.txt" or die "ERROR: No puedo abrir el archivo: $!\n" );
  4. open( OUT, ">D:/etc/$actividad.txt" );
  5. while ( $linea = <IN> ) {
  6.  
  7.     $linea =~ /basquetbol/;
  8.  
  9.     print OUT $linea;
  10. }
  11. close(IN);
  12. close(OUT);
  13.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Lo intenté hacer de esta manera. También lo que busco es introducir los datos del archivo en un arreglo y compararlo e imprimir lo que obtengo pero no funciona. Probé esto para luego implementar que en caso que sea igual en lugar de imprimirlos que los guardara en un archivo con el valor que toma la variable $_.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Data::Dumper;
  3. open( CONTRAS, "+<D:/etc/ticketsven.txt" );
  4. while (<CONTRAS>) {
  5.     chomp;
  6.     push @archivo, [split];
  7.     my $variable = basquetbol;
  8.     foreach (@archivo) {
  9.         if ( $_ == $variable ) {
  10.             print "$_ \n";             # imprimimos la línea en turno
  11.         }
  12.     }
  13. }
  14. close(CONTRAS);
  15.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
charlygarza
Perlero nuevo
Perlero nuevo
 
Mensajes: 26
Registrado: 2013-05-11 13:22 @598

Publicidad

Re: Insertar registros de un archivo a otro

Notapor danimera » 2013-05-30 11:02 @501

Primero que todo pasa por poner el contenido de un fichero dentro de un array. Basta con
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open (FICHERO, $fichero);
  2.  
  3. @array = <FICHERO>;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Como puedes ver, amigo charly, ahí puedes recorrer el array con un for y hace la comparación de cada línea con tu variable.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $variable = 'basquetbol';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Insertar registros de un archivo a otro

Notapor explorer » 2013-05-30 12:30 @562

Recuerda también que el operador '==' es un comparador numérico. Si lo que quieres es comparar cadenas de caracteres, debes usar alguno de los comparadores alfanuméricos: 'eq', 'ne', 'lt', 'le', 'gt' o 'ge'.
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: Insertar registros de un archivo a otro

Notapor charlygarza » 2013-05-30 16:59 @749

Gracias por tu respuesta. Tengo algunos problemas.

1- no crea el archivo con el nombre de la variable
2- no ingresa los datos cuando encuentra la palabra basquetbol en el arreglo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. open( CONTRAS, "+<D:/etc/ticketsven.txt" );
  4. while (<CONTRAS>) {
  5.     chomp;
  6.     push @archivo, [split];
  7.     my $variable = 'basquetbol';
  8.     foreach (@archivo) {
  9.         if ( $_ eq $variable ) {
  10.             open(OUT, "+>D:/etc/$variable.txt");
  11.             print "@archivo";
  12.            
  13.         }
  14.     }
  15.        print "$_ \n";             # imprimimos la línea en turno
  16. }
  17. close(CONTRAS);
  18. close(OUT);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
charlygarza
Perlero nuevo
Perlero nuevo
 
Mensajes: 26
Registrado: 2013-05-11 13:22 @598

Re: Insertar registros de un archivo a otro

Notapor danimera » 2013-05-30 17:14 @759

No estoy seguro de esta línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open(OUT, "+>D:/etc/$variable.txt");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

normalmente yo haría
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open (OUT,">$file");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

pero aun así, ¿estás seguro de que te está abriendo el fichero y lo está recorriendo bien?
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Insertar registros de un archivo a otro

Notapor charlygarza » 2013-05-30 18:08 @797

El primer archivo lo recorre bien pues me muestra los datos. El problema tal vez está en la comparación ya que imagino que el arreglo guarda los datos como uno solo: 1:basquetbol:españa:100 y de esta manera no puede igualar la búsqueda basquetbol con la línea que guarda como una posición en el arreglo...
charlygarza
Perlero nuevo
Perlero nuevo
 
Mensajes: 26
Registrado: 2013-05-11 13:22 @598

Re: Insertar registros de un archivo a otro

Notapor explorer » 2013-05-30 18:35 @816

Los paréntesis en los open() están mal: están rodeando a los die(), cuando en realidad los die() debería estar fuera de la operación open().

Si creo que lo he entendido, sería algo así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my @actividades = qw(
  4.     concierto  cine
  5.     futbol     basquetbol
  6.     desfile
  7. );
  8.  
  9. open(IN, "<D:/etc/ticketsven.txt") or die "ERROR: No puedo abrir el archivo: $!\n";
  10.  
  11. while (my $linea = <IN>) {
  12.  
  13.     for my $actividad (@actividades) {                 # recorremos todas las actividades
  14.  
  15.         if ($linea =~ /$actividad/) {                  # ¿está la $actividad dentro de la $linea?
  16.  
  17.             open( OUT, ">>D:/etc/$actividad.txt" );    # sí, abrimos el archivo correspondiente, en modo añadir
  18.             print OUT $linea;                          # guardamos la $linea
  19.             close OUT;
  20.  
  21.             last;                                      # no hace falta seguir mirando más actividades
  22.         }
  23.     }
  24. }
  25. close IN;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Vamos leyendo por líneas; por cada una, la comparamos con todas las actividades, y cuando alguna coincide, grabamos la línea en el archivo de la actividad.

Esto no es nada eficiente. Se puede mejorar:
  • si sabemos cómo es la estructura interna del archivo que estamos leyendo
  • si antes del bucle abrimos todos los archivos en los que vamos a escribir
Otra forma de hacerlo sería usando grep() (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my @actividades = qw(                     # recordamos las actividades que nos interesan
  4.     concierto  cine
  5.     futbol     basquetbol
  6.     desfile
  7. );
  8.  
  9. open( IN,  "<D:/etc/ticketsven.txt" ) or die "ERROR: No puedo abrir el archivo: $!\n";
  10. my @lineas = <IN>;                        # leemos todas las líneas
  11. close IN;
  12.  
  13. for my $actividad (@actividades) {                 # recorremos todas las actividades
  14.     open  OUT, ">>D:/etc/$actividad.txt";          # abrimos el archivo correspondiente, en modo añadir
  15.     print OUT grep { /$actividad/ } @lineas;       # guardamos en él todas las @lineas que coincidan con la $actividad
  16.     close OUT;
  17. }
  18.  
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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Insertar registros de un archivo a otro

Notapor charlygarza » 2013-05-30 18:51 @827

Muchas gracias. Utilizando la función grep() me crea los archivos con el nombre correcto de la actividad y me los ingresa todo bien, pero también crea otros archivos como las.txt y aquí ingresa los campos de la actividad fútbol, así como otros campos de texto. Lo he intentado modificar pero la verdad no me ha funcionado.
charlygarza
Perlero nuevo
Perlero nuevo
 
Mensajes: 26
Registrado: 2013-05-11 13:22 @598

Re: Insertar registros de un archivo a otro

Notapor explorer » 2013-05-30 18:59 @833

Eso es porque no sabemos cómo es el archivo de entrada por dentro. ¿No puedes publicar unas pocas líneas para que lo veamos?

Es muy posible que el fallo esté en las palabras con tildes.
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: Insertar registros de un archivo a otro

Notapor charlygarza » 2013-05-30 19:27 @852

Estos son los registros actuales. Este es el formato:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
1:basquetbol:chiquimula:mayo 2013:chiquimula
2:futbol:esquipulas:jutiapa:paiz
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Este es el código que utilicé.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. open IN, "+<D:/etc/ticketsven.txt" or die "ERROR: No puedo abrir el archivo: $!\n";
  4. seek IN, 0, 2;
  5.  
  6. for($x=1; $x<=3; $x=$x+1){
  7.  
  8.     print "introduzca datos  \n";
  9.     print "ingrese numero de ticket: ";
  10.     chomp( $numero = <STDIN> );
  11.  
  12.  
  13.      print "ingrese tipo de actividad: ";
  14.      chomp( $actividad = <STDIN> );
  15.    
  16.      print "ingrese lugar de actividad: ";
  17.      chomp( $lugar = <STDIN> );
  18.      
  19.      print "ingrese fecha de actividad: ";
  20.      chomp( $fecha = <STDIN> );
  21.      
  22.      print "ingrese lugar de compra: ";
  23.      chomp( $lugarcompra = <STDIN> );
  24.      
  25.      print "ingrese precio ticket: ";
  26.      chomp( $precio = <STDIN> );
  27.  
  28.     print IN "$numero:$actividad:$lugar:$fecha:$lugarcompra\n";
  29.    
  30.     print "\n";
  31. }
  32.  
  33. close IN;
  34.  
  35. print "INFORMACIÓN TICKETS VENDIDOS \n";
  36. print "=================================================================== \n";
  37. open IN, "<D:/etc/ticketsven.txt" or die "ERROR: No puedo abrir el archivo: $!\n";
  38. while ( $linea = <IN> ) {
  39.     ( $numero, $snombre, $papellido, $sapellido ) = split( /:/, $linea, 20 );
  40.     print "Numero de ticket: " . $numero . "    ACTIVIDAD: " . $actividad . "    LUGAR: " . $lugar . "    FECHA: " . $fecha ."    LUGAR COMPRA: " . $lugarcompra . "    PRECIO: " . $precio ."\n";
  41.    
  42. }
  43. close IN;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
charlygarza
Perlero nuevo
Perlero nuevo
 
Mensajes: 26
Registrado: 2013-05-11 13:22 @598

Siguiente

Volver a Básico

¿Quién está conectado?

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