• Publicidad

Ayuda con Excel y base de datos

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

Ayuda con Excel y base de datos

Notapor Pepito_el_programer » 2016-10-07 09:38 @443

Buenas.

Estoy aprendiendo Perl desde hace poco tiempo, y la verdad, me queda mucho camino. Tengo un ejercicio que estoy atascado y me gustaría si no es mucha molestia que me ayudarais de la mejor manera posible.

Tengo un programa sencillo donde me conecto a una base de datos. Realizo una consulta sencilla y lo que me devuelve lo introduzco en un Excel a modo de tabla.

Ahora tengo que crear una segunda tabla donde me muestre la cuenta de las filas obtenidas en la consulta.

Me explico mejor: la consulta me devuelve formas y colores. Por ejemplo: estrella-roja, estrella-azul, circulo-verde, circulo-azul, triangulo-rojo, triangulo-azul. Con esos datos que obtengo tengo que crear una tabla donde las filas sean las formas y las columnas los colores y contar las veces que aparecen esas combinaciones. Si no aparecen (por ejemplo, triangulo-verde), no se pone.

Solo las que aparezcan en la consulta, la suma de los números de la tabla tiene que ser el mismo que el número de registros de la consulta.

Hasta donde tengo realizado es hasta esta última parte, y la verdad, no sé cómo seguir. Quiero poner un hash con dos claves (forma y color) y un valor, pero me lío bastante y me bloqueo. Tampoco sé si es la mejor forma o la más sencilla.

Os copio lo que tengo hasta ahora a ver si alguien me pudiese ayudar.

Muchas gracias.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use warnings;
  5. use Spreadsheet::WriteExcel;
  6. use Excel::Writer::XLSX;
  7. use DBI;
  8. use FileHandle;
  9. use DBD::Teradata;
  10.  
  11. my ($dbh,$sthformas,$filename);
  12.  
  13. my (@forma,@color);
  14.  
  15.  
  16. $dbh = DBconnect(); #me conecto a la bbdd
  17.  
  18. my $query = qq[
  19.                 SELECT
  20.                         Forma,
  21.                         color  
  22.                 FROM
  23.                         TABLA
  24. ];
  25. $sthformas = $dbh->prepare($query);
  26.        
  27. $filename="pepe.xlsx";
  28. open my $fh, '>', $filename or die;
  29. my $workbook  = Excel::Writer::XLSX->new($fh);
  30.  
  31.  
  32. my $formato = $workbook->add_format();
  33. $formato->set_bold();
  34. $formato->set_color('#000000');
  35. $formato->set_align('center');
  36. $formato->set_bg_color('#FFD700');
  37. $formato->set_font('Arial');
  38. $formato->set_border(1);
  39. $formato->set_size(8);
  40.        
  41. my $pestaña   = $workbook->add_worksheet("Pepe");  
  42.        
  43.  
  44. my @row2 = ( 'FORMA','COLOR'); 
  45.  
  46. $pestaña->write_row( 0, 0, \@row2 ,$formato);
  47. $sthformas->execute();
  48.  
  49.  
  50. while(my $ref = $sthformas->fetchrow_hashref) {
  51.         my($forma, $color) = ($ref->{forma},$ref->{color});
  52.         $forma =~ s/\s+$//;
  53.         $color =~ s/\s+$//;
  54.  
  55.         push (@forma,$forma);
  56.         push (@color, $mes);
  57. }
  58.  
  59. $pestaña->write_col(1, 0, \@forma,$formato);
  60. $pestaña->write_col(1, 1, \@color,$formato);
  61.  
  62. #escribo los resultados de mi query en la excel.
  63.  
  64. my @color = sort(@color);
  65. my @color_unico;
  66. my $i=0;
  67. $color_unico[0] = $color[0];
  68. foreach my $item(@color) {
  69.         unless($item eq $color_unico[$i]) {
  70.                 push(@color_unico,$item);
  71.                 $i++;
  72.         }
  73. }
  74.  
  75. # me creo un array con los únicos para meterlos en la tabla 2.
  76.  
  77. my @forma = sort(@forma);
  78. my @forma_unico;
  79. my $j=0;
  80. $forma_unico[0] = $forma[0];
  81. foreach my $item2(@forma) {
  82.         unless($item2 eq $forma_unico[$j]) {
  83.                 push(@forma_unico,$item2);
  84.                 $j++;
  85.         }
  86. }
  87.  
  88. #### INTRODUCIR TABLA 2
  89. $pestaña->write_col(2,6,\@color_unico,$formato);
  90. $pestaña->write_row(1,7,\@forma_unico,$formato);
  91.  
  92. $workbook -> close();
  93.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Pepito_el_programer
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2016-10-06 13:56 @622

Publicidad

Re: Ayuda con Excel y base de datos

Notapor explorer » 2016-10-10 15:15 @677

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

A ver si con el siguiente ejemplo, te vale para entender los hashes con una clave prefabricada.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2.  
  3. my %formas;                             # aquí recordamos todas las formas
  4. my %colores;                            # aquí recordamos todos los colores
  5. my %formas_colores;                     # y aquí las combinaciones de los dos
  6.  
  7. while (<DATA>) {                        # para todas las líneas del archivo de más abajo
  8.     chomp;                              # quitamos el carácter de fin de línea
  9.     next if not $_;                     # pasamos a la siguiente, si es una línea vacía
  10.  
  11.     $formas_colores{$_}++;              # llevamos la cuenta de combinaciones
  12.  
  13.     my($forma, $color) = split /-/;     # sacamos la $forma y el $color
  14.  
  15.     $formas{$forma}  = 1;               # recordar la $forma
  16.     $colores{$color} = 1;               # recordar el $color
  17. }
  18.  
  19. my @colores = sort keys %colores;               # listado de colores, alfabético
  20. print map { sprintf "%10s", $_ } ' ', @colores; # titular de la tabla
  21. print "\n";
  22.  
  23. for my $forma (sort keys %formas ) {            # para todas las formas
  24.  
  25.     printf "%10s", $forma;                      # titular de la fila
  26.  
  27.     for my $color (@colores) {                  # para todos los colores
  28.  
  29.         if (exists $formas_colores{"$forma-$color"}) {          # si existe esa combinación
  30.             printf "%10s", $formas_colores{"$forma-$color"};    # sacamos la cuenta hecha antes
  31.         }
  32.         else {                                                  # si no
  33.             printf "%10s", '-';                                 # un guión
  34.         }
  35.     }
  36.  
  37.     print "\n";                                                 # fin de fila
  38. }
  39.  
  40. __DATA__
  41. estrella-rojo
  42. estrella-azul
  43. circulo-verde
  44. circulo-azul
  45. triangulo-rojo
  46. triangulo-azul
  47. circulo-verde
  48. circulo-azul
  49. estrella-rojo
  50. estrella-azul
  51. circulo-verde
  52. circulo-azul
  53. triangulo-azul
  54. circulo-verde
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
El resultado es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
                azul      rojo     verde
   circulo         3         -         4
  estrella         2         2         -
 triangulo         2         1         -
Coloreado en 0.000 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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ayuda con Excel y base de datos

Notapor Pepito_el_programer » 2016-10-25 10:13 @467

Muchísimas gracias.

Me sirvió de mucha ayuda.

Un saludo.
Pepito_el_programer
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2016-10-06 13:56 @622


Volver a Básico

¿Quién está conectado?

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

cron