• Publicidad

Corte de control

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

Corte de control

Notapor krahd » 2014-04-12 20:55 @913

¡Hola! Debo leer datos de un archivo .cvs donde dos de sus columnas cumplen cierta condición.

Ejemplo: Coln = "Algo" y Coln+1 = "Otra cosa".

El tema es que debo depurar mejor esa información, ya que hay una tercera columna que va variando y es la que genera el corte.

Venga:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
otras columnas Algo;Otra cosa; 12
otras columnas Algo;Otra cosa; 12
otras columnas Algo;Otra cosa; 20
otras columnas Algo;Otra cosa; 20
otras columnas Algo;Otra cosa; 20
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


En este caso debo separar en dos bloques la salida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
*Título
otras columnas Algo;Otra cosa; 12
otras columnas Algo;Otra cosa; 12
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
*Titulo
otras columnas Algo;Otra cosa; 20
otras columnas Algo;Otra cosa; 20
otras columnas Algo;Otra cosa; 20
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

La opción más simple fue cargar todo en un array y luego recorrerlo e ir agrupando acorde cambia la columna 3.

Pero no sé si existe otra opción.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @lineas = <>;
  2.  
  3. $todo = join '', @lineas;
  4.  
  5. $ant    = 0;
  6. $titulo = "bla bla";
  7.  
  8. while ( $todo =~ /(+.?);(+.?);(+.?);Algo;Otra cosa;(+*?)/gsm ) {
  9.     if ( $ant != $4 ) {
  10.         $ant = $4;
  11.         print $titulo;
  12.     }
  13.     if ( $ant == $4 ) {
  14.         print renglones;
  15.     }
  16.     print etc etc
  17.  
  18. }
  19.  
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


¡Gracias!
krahd
Perlero nuevo
Perlero nuevo
 
Mensajes: 1
Registrado: 2014-04-06 15:04 @670

Publicidad

Re: Corte de control

Notapor explorer » 2014-04-13 14:26 @643

Bueno, en Perl, una misma tarea se puede hacer de muchas maneras. La que has escogido es uno de las más lógicas.

Esta es mi versión:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;
  4.  
  5. open my $archivo, 'code_37056.txt';     # abrimos el archivo en modo lectura
  6.  
  7. my $ant = 0;
  8. my $titulo = "*Titulo\n";
  9.  
  10. while (<$archivo>) {                    # para todas las líneas del archivo
  11.     my @columnas = split /[;]/;         # partimos la línea y sacamos las columnas
  12.  
  13.     $columnas[2] =~ s/(^\s+|\s+$)//g;   # a la tercera columna le limpiamos los espacios
  14.  
  15.     if ($ant ne $columnas[2]) {         # si la tercera columna es distinta de la anterior
  16.         $ant  = $columnas[2];           # recordaremos esta nueva columna
  17.         print $titulo;                  # imprimimos nuevo título
  18.     }
  19.  
  20.     print;                              # imprimimos la línea
  21. }
  22.  
  23. close $archivo;                         # cerramos el archivo
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


Volver a Básico

¿Quién está conectado?

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