• Publicidad

Comparar todas las columnas

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

Comparar todas las columnas

Notapor Mirvana » 2014-11-14 22:52 @994

Hola. Estoy algo liada. El script lo que debe de realizar es que recorra un archivo comparando todas las columnas: la primera con todas, la segunda con todas, etc. y diga qué columnas son iguales, siempre y cuando las columnas tenga sus mismos valores en sus índices. Si compara la primera posición y son iguales sigue con la siguiente, si es diferente se sale. Y que continúe con la siguiente columna. Es allí donde estoy liada: no cambia de columna, solo se queda con la uno y la dos.

El archivo tiene el siguiente formato:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
1 0 1 0 1 1 1 1
0 1 0 0 1 1 0 1
0 1 0 1 0 1 0 0
0 1 0 1 0 1 0 0
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


El script es el siguiente
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #######################################################################################################################
  2. # SCRIPT debe recorrer todas las columnas y filas. Comparar la columna 1 con todas las demas columnas y decir si son iguales cuando se
  3. #tienen lo mismo elementos en los mismo indice y decir que columnas son iguales.Despues la columna la 2 con todos y asi sucesivamente
  4. #######################################################################################################################
  5.  
  6. #!usr/bin/perl -w
  7.  
  8. use strict;
  9. use warnings;
  10.  
  11. #---Declaracion de Variables.
  12.  
  13. my $count1=0;
  14. my $count2=0;
  15. my $inicio2=1;
  16. my $col1="";
  17. my $col2="";
  18.  
  19. my @Var_Archivo1 = '';
  20. my @Var_Archivo2 = '';
  21. my $Archivo1 = '';
  22. my $Archivo2 = '';
  23. my $Cadena1='';
  24. my $Cadena2='';
  25.  
  26. $Archivo1= "mATRIZ-1.txt";
  27.  
  28. open(FILE1,"< $Archivo1");
  29. $count1++ while <FILE1>;
  30. close(FILE1);
  31.  
  32. open(ARCHIVO2,$Archivo1) or die "no se pudo abrir el archivo";
  33. @Var_Archivo1=<ARCHIVO2>;
  34. close(ARCHIVO2);
  35.  
  36. print "No. lINEAS: $count1\n";
  37.  
  38. my ($j, $cuenta1, $cuenta2);
  39. my $col=58;
  40.  
  41. for($j=0;$j<$col;$j++)
  42.  {
  43.   for(my $inicio1=0; $inicio1<$count1; $inicio1++)
  44.     {
  45.             $col1=substr $Var_Archivo1[$inicio1],$j,1;
  46.             $col2=substr $Var_Archivo1[$inicio1],$j+2,1;
  47.             if($col1 eq $col2)
  48.              {
  49.                  $cuenta1++;
  50.                  print "Son Iguales\n";
  51.                  print "\n$col1  $col2\n";
  52.              } else{
  53.                 print "\n$col1  $col2\n";
  54.                 print "Son Diferentes\n";
  55.                  print "$inicio1\n";
  56.                 exit;
  57.              }
  58.              $col1="";
  59.              $col2="";
  60.        print "$inicio1\n";
  61.       }
  62.   }
  63.  
  64. close Archivo_Texto;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Espero sus comentarios. Gracias.
Última edición por explorer el 2014-11-15 09:38 @443, editado 2 veces en total
Razón: que => qué; indices => índices; continue => continúe; marcas Perl
Mirvana
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2010-09-25 14:30 @646

Publicidad

Re: Comparar todas las columnas

Notapor Aceitunas » 2014-11-15 06:19 @305

Mete los datos en arrays multidimensionales y podrás trabajar con los datos de manera muy sencilla.

EDITO: Pero... si los índices tienen que ser iguales, no te va a coincidir ninguna columna :?
Voy a llegar hasta el final, voy a subir la velocidad - Migue Benítez.
Aceitunas
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2013-11-07 15:25 @684
Ubicación: Ciudad Real, España.

Re: Comparar todas las columnas

Notapor explorer » 2014-11-15 10:24 @475

Te faltan algunas líneas más...

Primero debes leer toda la información, por líneas e irlas guardando por columnas.

Una vez que tienes las columnas, debes hacer la comparación. Como de cada columna debes compararla con todas las restantes, debes hacer un bucle doble:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for (my $columna = 0; $columna < @columnas-1; $columna++) {
  2.  
  3.     for (my $col_a_comparar= $columna+1; $col_a_comparar < @columnas; $col_a_comparar++) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero... hay otras formas...

Hay formas más sencillas de hacer la comparación. Basta con recordar que los hashes sirven, precisamente, para recordar.

Entonces, si usamos un hash cuyas claves sean las columnas, podemos llevar una cuenta de la aparición de cada una de ellas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.12;                              # para recorrer índices y valores de los arrays
  3.  
  4. my @columnas;                           # almacén de las columnas
  5.  
  6. while (<DATA>) {                        # leemos los datos que hay al final del programa
  7.  
  8.     my @cols = split;                   # leemos una línea y la partimos en columnas
  9.  
  10.     while(my($i,$v) = each @cols) {     # para cada una de las columnas leídas
  11.  
  12.         $columnas[$i] .= $v;            # la vamos guardando en el array de @columnas definitivo
  13.     }
  14. }
  15.  
  16. my %unicas;                             # registro de las columnas únicas
  17.  
  18. while(my($i, $columna) = each @columnas) {      # para todas las @columnas
  19.     push @{$unicas{$columna}}, $i               # guardamos el número de columna ($i) en
  20.                                                 # en un array indexado por la propia $columna
  21. }
  22.  
  23. my @columnas_distintas = keys %unicas;          # listado de columnas únicas
  24.  
  25. @columnas_distintas = map{                      # por cada una de ellas, las convertimos en
  26.                 [                               # un array con dos valores:
  27.                     $_,                         #       la forma de la propia columna, y
  28.                     $unicas{$_}                 #       una referencia al array que guarda los índices a las columnas coincidentes
  29.                 ]
  30.     }
  31.     @columnas_distintas;
  32.  
  33. @columnas_distintas = sort {                    # ahora podemos ordenarlas como queramos
  34.  
  35.         $a->[1][0] <=> $b->[1][0]                       # ordenación según la primera columna coincidente
  36. #       scalar(@{$b->[1]}) <=> scalar(@{$a->[1]})       # ordenación según el número de columnas coincidentes
  37.     }
  38.     @columnas_distintas;
  39.  
  40. for (@columnas_distintas) {         # salida en pantalla
  41.                                     # cada elemento de @columnas_distintas es una referencia a un array
  42.                                     # la columna está en el primer valor (0) y la lista de coincidentes, en el segundo (1)
  43.     say $_->[0], ': ', join ',', @{ $_->[1] };
  44. }
  45.  
  46. __DATA__
  47. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  48. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  49. 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
  50. 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  51. 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  52. 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  53. 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  54. 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  55. 1 0 1 0 1 1 1 1 0 1 0 0 1 1 1 0 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  56. 0 1 0 1 0 0 0 0 1 0 1 1 0 0 0 1 0 1 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  57. 1 0 1 0 1 1 1 1 0 1 0 0 1 1 1 0 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  58. 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  59. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  60. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  61. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  62. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  63. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  64. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  65. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 1 1 0 1 0 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 0 1 0 0 1 1 1 1
  66. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  67. 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 0 1 1 0 1 1 1 1 1 1 1 0 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 1 1
  68. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  69. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  70. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
  71. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  72. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  73. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 N 1 N 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  74. 1 0 1 1 0 0 1 1 1 0 1 1 1 0 1 1 1 1 1 0 0 1 1 0 N 1 N 1 0 0 1 1 1 1 1 0 1 1 1 0 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 1
Coloreado en 0.007 segundos, usando GeSHi 1.0.8.4
La salida es (para la primera opción de ordenación):
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
1101010010101111011100101111: 0,27,32,40,45,51
1111010101001111011110101110: 1
1101010010101111011110101111: 2,6,7,12,14,18,21,30,31,33,34,36,37,38,46
1101010101001111011110101111: 3,10
1101010010101111011110101110: 4,5,9,13,20,23,28,39,48,49,54,55,56
1111010101001111011100101111: 8
1100101001011111011110101111: 11,15
1101010010101111010110101111: 16,22,52,53
1101010101001111010110101111: 17
1101010101001111010110101110: 19,42
00110101010011111100010111NN: 24
1101010101001111111110101111: 25
11010101010011110101101011NN: 26
1101010010101111010100101110: 29
1101010101001111011110101110: 35,41
1101010010101111011100101110: 43,44
1101010010101111010110101110: 47
1111010010101111010110101110: 50
1101010010101111011110111111: 57
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Por ejemplo, la primera línea quiere decir que la columna que sale ahí a la izquierda, aparece en las posiciones (columnas) 0, 27, 32, 40, 45 y 51.
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: Comparar todas las columnas

Notapor Mirvana » 2014-11-16 16:42 @737

Muchas gracias por sus consejos.
Mirvana
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2010-09-25 14:30 @646


Volver a Básico

¿Quién está conectado?

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