• Publicidad

Meter dos lineas en una

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

Meter dos lineas en una

Notapor Maku79 » 2018-03-22 07:05 @336

¡Buenas!

Encantada de formar parte de este nuevo mundo que es para mi el lenguaje Perl. Llevo varios días leyendo y revisando en el foro por si encontraba la solución a mi problema, pero al final no es el resultado que quiero así que voy a explicarme lo mejor posible.

Tengo un fichero .txt bastante extenso (unas 100 000 líneas) con la estructura "código de números, nombre con letras", es decir:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Codigo_Numeros_longitud_variable1,Nombres_longitud_variable1
Codigo_Numeros_longitud_variable2,Nombres_longitud_variable2
Codigo_Numeros_longitud_variable3,Nombres_longitud_variable3
Codigo_Numeros_longitud_variable3,Nombres_longitud_variable4
.....
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Necesito crear otro fichero .txt de la siguiente forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Codigo_Numeros_longitud_variable1,Nombres_longitud_variable1,Codigo_Numeros_longitud_variable2,Nombres_longitud_variable2
Codigo_Numeros_longitud_variable3,Nombres_longitud_variable3,Codigo_Numeros_longitud_variable3,Nombres_longitud_variable4
.....
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Me refiero a que cada dos líneas del primer fichero se forme una sola línea separada por comas en el fichero de salida.

No sé si me he explicado bien...

He probado infinidad de opciones y todas, o me salen las comas donde no tocan o me lo pone todo en una sola línea o me lo separa en letras o simplemente me lo muestra tal cual el fichero de entrada... Me estoy volviendo loca :shock:

Pongo un par de ejemplos de lo que he probado y que no funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use autodie;
  3. use warnings;
  4.  
  5. open my $fichero, '<prueba.txt' or die "ERROR: No puedo leer el fichero: $!\n";
  6. open my $OTRO, ">otro.txt" or die "ERROR: No encuentro el fichero: $!\n";
  7.  
  8. while (my $linea = <$fichero>) {
  9.         chomp $linea;
  10.         push @array, $linea;
  11.         print $OTRO "$array[0]$array[1],$array[2]$array[3]\n";
  12. }
  13.  
  14. close $fichero;
  15. close $OTRO;
  16.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Otro ejemplo
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use autodie;
  3. use warnings;
  4.  
  5. open FICHERO, "<prueba.txt" or die "ERROR: No encuentro el fichero prueba.txt\n";
  6. open my $OTRO, ">otro.txt" or die "ERROR: No encuentro el fichero otro.txt\n";
  7. @lineas = <FICHERO>        or die "ERROR: No puedo leer el fichero\n";
  8. close FICHERO              or die "ERROR: No puedo cerrar el fichero\n";
  9.  
  10. foreach ( @lineas ) {
  11.         push @rray, [ split // ];
  12. }
  13.  
  14. my $contador = 0;
  15. for ( $j = 0; $j < @rray; $j++ ) {
  16.        
  17.     for ( $i = 0; $i < @{$rray[$j]}; $i++ ) {
  18.         #print $OTRO $rray[$j][$i];
  19.                 print $rray[$j][$i];
  20.                 #print ",\n";
  21.     }
  22. }
  23. close $OTRO;
  24.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

No sé, creo que estoy cerca de la solución, pero debo estar haciendo algo mal y no lo veo.

He abierto el hilo porque llevo toda la semana dándole vueltas. Si alguien me pudiera echar una mano estaría muy agradecida :)

Gracias de antemano.
Maku79
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2018-03-22 06:44 @322

Publicidad

Re: Meter dos lineas en una

Notapor explorer » 2018-03-22 09:14 @426

Bienvenido a los foros de Perl en Español, Maku79.

Perl se caracteriza por hacer sencillas las operaciones normales con archivos de texto.

Por ejemplo, tu problema se puede resolver desde la misma línea de comandos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
$ perl -anE 'BEGIN { $a="" } chomp; if ($. % 2 == 0) { say "$a,$_"; $a="" } else { $a=$_ } END { say $a if $a }' prueba.txt
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Escrito en forma de programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.10.1;
  3. use strict;
  4. use warnings;
  5.  
  6. my $anterior = "";
  7.  
  8. open my $FH, '<', 'prueba.txt';
  9. open my $OH, '>', 'otro.txt';
  10.  
  11. while (<$FH>) {
  12.     chomp;
  13.  
  14.     if ($. % 2 == 0) {                  # si el número de la línea leída es par...
  15.  
  16.         sat $OH "$anterior,$_";         # sacamos la $anterior y la actual
  17.  
  18.         $anterior = "";
  19.     }
  20.     else {
  21.         $anterior = $_;                 # sino, la recordamos
  22.     }
  23. }
  24.  
  25. say $OH $anterior  if $anterior;        # sacamos la última línea, si queda algo que mostrar
  26.  
  27. close $FH;
  28. close $OH;
  29.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

La variable $. lleva la cuenta de líneas leídas, comenzando en 1.

Más información, en tu propio ordenador con el comando perldoc perlvar, y en la Web (y en español).
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: Meter dos lineas en una

Notapor Maku79 » 2018-03-22 09:34 @440

Madre mía, qué tonta... :oops:

No se me había ocurrido lo de si el número de líneas es par, vaya tela... ¡qué bloqueo más tonto! :oops:

Me ha funcionado a la perfección, ¡¡millones de gracias!! :D

Otra pregunta que me surge, ¿por qué no cierras los ficheros? ¿Podría provocar problemas?

¡¡Gracias de nuevo!!
Maku79
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2018-03-22 06:44 @322

Re: Meter dos lineas en una

Notapor explorer » 2018-03-22 10:16 @469

De tonta, nada. Es una técnica más, que ahora ya conoces.

Pero es un problema que se puede resolver de muchas maneras.

Por ejemplo, la solución con un array:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.10;
  3. use strict;
  4. use warnings;
  5. use autodie;
  6.  
  7. # Leemos el archivo    
  8. open my $ARCHIVO, '<', 'code_40678.txt';
  9. my @array = <$ARCHIVO>;
  10. close $ARCHIVO;
  11.  
  12. chomp @array;
  13.  
  14. open my $OTRO, '>', 'otro.txt';
  15. for (my $i = 0; $i < @array; $i+=2) {
  16.     say $OTRO "$array[$i],$array[$i+1]";
  17. }
  18. close $OTRO;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

El truco está en el bucle for, que va saltando $i de dos de dos. Pero hay un problema si el número de líneas no es par: la última línea saldrá con una coma suelta. Bueno, es fácil de solventar.

En cuanto a la falta de close()... bueno, sí, hay que ponerlos, pero en este caso, como el programa termina ahí, pues de eso ya se encarga Perl, de cerrar todos los archivos que queden abiertos. Pero sí, lo normal es ponerlo para mostrar que ahí termina el proceso. Ya edité el mi mensaje y lo he puesto.
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: Meter dos lineas en una

Notapor Maku79 » 2018-03-23 02:25 @142

¡¡Muchas gracias, explorer!!

La verdad es que es alucinante lo que se puede hacer con Perl. Yo acabo de empezar con él pero me doy cuenta de lo potente que es y la de cantidad de formas diferentes que hay para hacer las cosas.

¡¡Gracias, de verdad!! Tanto por las explicaciones como por los enlaces de Perl, que sin duda consultaré :D
Maku79
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2018-03-22 06:44 @322


Volver a Básico

¿Quién está conectado?

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