• Publicidad

Ordernar archivo

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

Ordernar archivo

Notapor dbustos » 2012-04-03 14:01 @625

Hola de nuevo.

Necesito reordenar un archivo de la siguiente manera:
Archivo original
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
A,B,5,6
A,C,8,9
A,F,52,4
B,C,5,6
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


rearreglo por campo primero:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
A,B,5,6,C,8,9,F,52,4
B,C,5,6
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


El script que tengo hasta ahora es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. ### Cabecera
  6. open my $OUTPUT, '>>', 'beta_doms.out';
  7.  
  8. ### Leer el primer archivo
  9. open my $ARQ, '<', "beta_arch_unip.out" or die "can not open the file $ARGV[0]";
  10. my @arq = <$ARQ>;
  11.  
  12. close $ARQ;
  13.  
  14. ### Leer el segundo archivo
  15. open my $LIST, '<', "beta_arch_unip.out" or die "can not open the file $ARGV[1]";
  16. my @list = <$LIST>;
  17. close $LIST;
  18.  
  19. ### Comparación
  20. for my $lastline (@arq) {              # para todas las líneas del primer archivo
  21.  
  22.     for my $thisline (@list) {         # para todas las líneas del segundo archivo
  23.  
  24.         my ( $NP1, $dom1, $I1, $F1 ) = split /,/, $thisline;
  25.         my ( $NP2, $dom2, $I2, $F2 ) = split /,/, $lastline;
  26.  
  27.         if (    $NP1 eq $NP2
  28.             and $I1 ne $I2
  29.             and $F1 ne $F2 ) {
  30.             print $OUTPUT join( "\,", $NP1, $dom1, $I1, $F1, $dom2, $I2, $F2, "\n" );
  31.         }
  32.     }
  33. }
  34.  
  35. close $OUTPUT;
  36.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

pero solo me sirve para dos filas iguales y no si hay tres o más filas con igual campo primero.

Desde ya, muchas gracias.
Última edición por explorer el 2012-04-03 14:43 @655, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Texto y Perl
dbustos
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2011-12-21 10:07 @463

Publicidad

Re: Ordernar archivo

Notapor explorer » 2012-04-03 15:15 @677

Esto es un trabajo ideal para los hash de Perl.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my %archivo;                                            # Nueva versión del archivo
  7.  
  8. open my $archivo, '<', 'beta_arch_unip.out';            # Leemos el archivo
  9.  
  10. while (my $linea = <$archivo>) {                        # Miramos todas las líneas
  11.     chomp $linea;                                       # Quitamos los finales de línea
  12.     my($primer_campo, $resto) = split /,/, $linea, 2;   # Partimos la línea en dos cachos
  13.     next if not $primer_campo;                          # Saltamos las líneas vacías
  14.     #print "[$primer_campo][$resto]\n";
  15.  
  16.     push @{$archivo{$primer_campo}}, $resto;            # Guardamos según el $primer_campo
  17. }
  18.  
  19. close $archivo;
  20.  
  21. open my $salida, '>', 'beta_doms.out';
  22. for my $campo (sort keys %archivo) {                    # Sacamos ordenado por los primeros campos
  23.     print $salida join(',', $campo, @{$archivo{$campo}}), "\n";    # El $campo, y sus valores correspondientes
  24. }
  25. close $salida;
  26.  
  27. __END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El trabajo que hacemos es leer línea por línea; de cada una de ellas, le quitamos los caracteres de fin de línea, ya que no nos sirven para nada; partimos la línea en dos partes según la primera coma; la primera parte será nuestro $primer_campo, que nos servirá de clave hash para guardar (push) el $resto, en un array que estará apuntado por el valor asociado a esa clave. En otras palabras, estamos creando una estructura hash de arrays.

Ya solo queda hacer la salida, haciendo un recorrido ordenado por las claves que hemos ido recolectando; por cada una de ellas, la imprimimos, junto con una coma, y la unión de todos los "restos" de línea acumulados en el array asociado.

Bueno, esta es una manera de hacerlo. Hay otras muchas.
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: Ordernar archivo

Notapor dbustos » 2012-04-04 07:50 @368

¡¡¡Muchas gracias!!!
dbustos
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2011-12-21 10:07 @463

Re: Ordernar archivo

Notapor explorer » 2012-04-04 10:05 @461

Si algo no entiendes, pregunta.

Más información -en tu propio ordenador- en perldoc perllol (Web) (traducido).
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 26 invitados