• Publicidad

Cargar fichero en array de dos dimensiones

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

Cargar fichero en array de dos dimensiones

Notapor coloradito » 2012-02-09 19:10 @840

Hola:

Tengo un fichero así

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
b,5,6,7
a,2,5,6
a,1,4,5
b,4,6,7
a,1,5,5
b,3,6,7
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Tengo que agrupar de los que empiecen por la misma letra.
Mi intención es cargarlo en un array de dos dimensiones.
Cargo todos los que empiezan por a:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
a,2,5,6
a,1,5,5
a,1,4,5
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

y ahora quiero ordenarlo
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
a,1,4,5
a,1,5,5
a,2,5,6
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

y ahora hago la agrupación.

Quiero:
pintar "a", el primer valor de la primera segunda columna, la suma de la tercera columna, y el último valor de la última columna, es decir: a,1,4+5+5,6.

¿Cómo hago para construir el array de dos dimensiones partiendo de un fichero y luego poder decirle qué quiero?

Navegar a la posición que yo quiera, a la array[0,0], o a la array[0,valor máximo],
@array[0,0], @array[0,1], @array[0,3]+@array[0,4], array[1,5].

Gracias.
coloradito
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2012-02-09 18:51 @827

Publicidad

Re: Cargar fichero en array de dos dimensiones

Notapor explorer » 2012-02-09 19:28 @852

Bienvenido a los foros de Perl en español, coloradito.

Te vale con hacer un bucle por todas las líneas del archivo.
Por cada línea, la partes en columnas con la ayuda de split().

Una vez que tengas la información en la matriz, ya la puedes ordenar.

Tienes que recorrer la matriz ordenada, también por filas, para sacar las estadísticas que te piden...

Muéstranos algo de código...
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: Cargar fichero en array de dos dimensiones

Notapor coloradito » 2012-02-10 01:13 @092

Hola, tengo algo como esto:

Me creo un array de dos dimensiones.
Tengo un fichero muy grande, por lo que no quiero cargar todo el fichero en un array, sino ir creando arrays pequeños según voy leyendo el fichero (el fichero ya está ordenado por el primer campo).
Según leo el fichero, todos los registros que empiezan por el mismo campo los meto en un array de dos dimensiones.
Luego lo puedo ordenar.
Pero cuando me toque el momento de totalizar quiero, por ejemplo, poder acceder a la primera línea del array y de la columna 4.

No sé cómo acceder directamente a una posición del array es decir: leer @$array[3,0] o acceder a la última línea del array @$array[$last_line,4].

Tengo muchos campos y quiero sobreescribir valores sobre la última línea para luego poder imprimir el resumen solo con

print join( '_', @$pinta[$lastline] ), "\n";

Es decir: a la última línea del array le quiero meter el acumulado.

Ejemplo: @$pinta[$lastline,3]=@$pinta[0,3] reemplazo el valor de la última línea en la columna 3 por el valor de la columna 3 de la primera línea.

¿Hay una variable que me diga cual es el número de líneas del array de dos dimensiones?
Quizás tengo que construir el array de 2 dimensiones de otra manera.

Gracias.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. LINE: while(<LFILE>) {
  2.            
  3.  
  4.   chomp;
  5.   $count++;
  6.  
  7.   my $linea;
  8.   @$linea = split( /,/, $_ );
  9.  
  10.  
  11.   if  ( @$anterior[0] eq  @$linea[0] )                                                    
  12.       {
  13.         #si la nueva línea es igual a la anterior añado la última al array
  14.         push @$hoja, $linea;
  15.                
  16.     }else
  17.     {
  18.        
  19.         #si la nueva línea es distinta a la anterior imprimo el array
  20.         foreach my $pinta ( sort { $a->[0] <=> $b->[0] } @$hoja ) {
  21.         print join( '_', @$pinta ), "\n";
  22.        
  23.         # ¿cómo puedo acceder a una posición del array de dos dimensiones directamente sin tener que recorre el array,
  24.         # es decir, quiero por ejemplo acumular info en la línea anterior @$anterior reemplazando :
  25.         # @$anterior[3]=@$hoja[0,3]
  26.                
  27.  
  28.         }
  29.        
  30.         @$anterior = @$linea;
  31.  
  32. } #while
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2012-02-10 06:58 @332, editado 2 veces en total
Razón: Marcas de código Perl
coloradito
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2012-02-09 18:51 @827

Re: Cargar fichero en array de dos dimensiones

Notapor explorer » 2012-02-10 11:33 @523

La explicación del funcionamiento básico de los array (y el acceso a sus elementos), lo tienes en tu ordenador, con perldoc perldata (traducido). La explicación de cómo funcionan las estructuras complejas, la tienes en perldoc perlref. Un recetario de usos de estructuras complejas la tienes en perldoc perldsc (traducido). Y, finalmente, existe un documento específico para el tratamiento de estructuras bidimensionales, en perldoc perllol (traducido).

Si tenemos un array @array, entonces podemos:
  • acceder al elemento número 3: $array[3]
  • acceder al elemento octavo: $array[7] (los array empiezan en 0)
  • acceder al último elemento del array, si no sabemos qué índice tiene: $array[-1]
  • número de líneas del array: $n = @array
  • acceder al elemento 3 de la línea 2: print $array[2]->[3], o print $array[2][3]
  • obtener los elementos 4 y 6 del array: ($cuatro, $seis) = @array[4,6]

En el código...
  • en la línea 11 no se puede comparar así dos líneas. Hay que hacerlo elemento a elemento. Solo en Perl 6 se pueden realizar cosas así

Edito: Sí que se pueden comparar dos array, para ver si son iguales, por medio del operador smart match (coincidencia inteligente), '~~', a partir de Perl v5.10. Pero los elementos de los array sí que han de ser básicos (escalares), para poderse comparar.
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: Cargar fichero en array de dos dimensiones

Notapor coloradito » 2012-02-11 03:39 @194

Hola:

Gracias por la información.
Al final encontré ejemplo de cómo hacerlo.
Dejo el ejemplo por si alguien llega a este post con la misma duda.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my ( @row, @table, $n, $rowref );
  6.  
  7. while (<DATA>) {
  8.     chomp;
  9.  
  10.     # regex to separate CSV (use of a cpan module for CSV STRONGLY advised...
  11.     @row = split( /,/, $_ );
  12.  
  13.     push( @table, [@row] );            #Note the [ ] around the list
  14. }
  15.  
  16. # Now the table is created, print it:
  17. my $rowcnt = 0;
  18. foreach $rowref (@table) {
  19.     print "row $rowcnt:\n";
  20.     $rowcnt++;
  21.     print "  [ @$rowref ], \n";
  22. }
  23.  
  24. # You can access the table in the classic [i][j] form:
  25. for my $i ( 0 .. $#table ) {
  26.     $rowref = $table[$i];
  27.     $n      = @$rowref - 1;
  28.     for my $j ( 0 .. $n ) {
  29.         print "element $i, $j of table is $table[$i][$j]\n";
  30.     }
  31. }
  32.  
  33. # You can format it:
  34. for my $i ( 0 .. $#table ) {
  35.     print "$table[$i][0] $table[$i][1]\n";
  36.     print "$table[$i][2]\n";
  37.     print "$table[$i][3], $table[$i][4] $table[$i][5]\n\n";
  38. }
  39. print "\n ------------desordenada \n";
  40.  
  41. # Now the table is created, print it:
  42. my $rowcnt = 0;
  43. foreach $rowref (@table) {
  44.     print "row $rowcnt: ";
  45.     $rowcnt++;
  46.     print "  [ @$rowref ], \n";
  47. }
  48.  
  49. my @sorted = sort {
  50.            $a->[0] cmp $b->[0]
  51.         || $a->[2] cmp $b->[2]
  52.  
  53. } @table;
  54.  
  55. #my @sorted
  56. #    = map  { $_->[1]               }
  57. #      sort { $a->[0] <=> $b->[0]   }
  58. #      map  { [ (split "_")[2], $_] }
  59. #      @table;
  60.  
  61. # Now the table is created, print it:
  62. print "\n ------------ordenada\n";
  63.  
  64. my $rowcnt = 0;
  65. foreach $rowref (@sorted) {
  66.     print "row $rowcnt: ";
  67.     $rowcnt++;
  68.     print "  [ @$rowref ], \n";
  69. }
  70.  
  71. __DATA__
  72. aaaa1,g,20120110-113,1
  73. aaaa3,c,20120110-3,1
  74. aaaa1,f,20120110-2,1
  75. aaaa2,a,20120110-23,1
  76. aaaa2,h,20120110-3,1
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2012-02-11 04:53 @245, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Perl
coloradito
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2012-02-09 18:51 @827


Volver a Básico

¿Quién está conectado?

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

cron