• Publicidad

Módulos para sacar promedios, valor más alto, más bajo.

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

Re: Cambiar las columnas de una tabla (archivo csv)

Notapor explorer » 2013-03-16 16:43 @738

Al final, resulta que no es necesario almacenar nada, porque acabamos de enterarnos que usas Text::CSV::Slurp, y ese módulo ya devuelve toda la información almacenada en una estructura ;)

Es normal que el bucle de la línea 34 no haga nada, porque... realmente no hace nada... (no estás dando la orden de borrado de elementos). Pero no importa: no es necesario borrar información porque el módulo que ha leído el csv ya tiene todo perfectamente almacenado.

Esta es una solución, siguiendo el esquema de cómo quieres que sea la salida: columnas separadas por un tabulador, siguiendo el orden de las métricas, servidores, y tiempos.

Con este programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;
  4. use Text::CSV::Slurp;
  5. use Data::Dumper;
  6.  
  7. ####################################################################################
  8. # Inicialización
  9. ####################################################################################
  10. my @letras_servidores = 'A' .. 'R';
  11. my @metricas = ('CPU Libre', 'SWAP Libre', 'RAM Libre');
  12.  
  13.  
  14. ####################################################################################
  15. ## Lectura del archivo
  16. ####################################################################################
  17. @ARGV == 1 or die "Uso: $0 <archivo CSV a procesar>\n";
  18.  
  19. my $archivo_csv = shift;
  20.  
  21. -f $archivo_csv or die "ERROR: el archivo $archivo_csv no existe\n";
  22.  
  23.  
  24. my $datos_ref = Text::CSV::Slurp->load(
  25.         file       => $archivo_csv,
  26.         sep_char   => ';',
  27.         quote_char => '"'
  28. );
  29.  
  30. #say Dumper $datos_ref; # mostraría estos datos
  31.  
  32.  
  33. ####################################################################################
  34. ## Salida
  35. ####################################################################################
  36. say join "\t" => qw( Timestamp Valor Entidad Metrica );
  37.  
  38. for my $metrica (@metricas) {
  39.  
  40.     LETRA:
  41.     for my $letra (@letras_servidores) {
  42.  
  43.         for my $linea_ref (@{$datos_ref}) {
  44.             next LETRA if not exists $linea_ref->{"servidor $letra $metrica"};
  45.  
  46.             say
  47.                 join "\t" =>
  48.                     $linea_ref->{'Tiempo'},
  49.                     $linea_ref->{"servidor $letra $metrica"},
  50.                     "servidor$letra",
  51.                     $metrica,
  52.             ;
  53.  
  54.         }
  55.     }
  56. }
  57.  
  58. __END__
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4
si le pasamos fotoinicial.csv de un mensaje anterior que contenía métricas para dos servidores, sale
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Timestamp       Valor   Entidad Metrica
8/03/13 12:15   92      servidorA       CPU Libre
8/03/13 12:20   97      servidorA       CPU Libre
8/03/13 12:25   96      servidorA       CPU Libre
8/03/13 12:30   93      servidorA       CPU Libre
8/03/13 12:35   97      servidorA       CPU Libre
8/03/13 12:40   97      servidorA       CPU Libre
8/03/13 12:45   96      servidorA       CPU Libre
8/03/13 12:50   97      servidorA       CPU Libre
8/03/13 12:55   94      servidorA       CPU Libre
8/03/13 13:00   97      servidorA       CPU Libre
8/03/13 13:05   98      servidorA       CPU Libre
8/03/13 13:10   94      servidorA       CPU Libre
8/03/13 13:15   96      servidorA       CPU Libre
8/03/13 13:20   98      servidorA       CPU Libre
8/03/13 13:25   96      servidorA       CPU Libre
8/03/13 13:30   97      servidorA       CPU Libre
8/03/13 12:15   92      servidorB       CPU Libre
8/03/13 12:20   97      servidorB       CPU Libre
8/03/13 12:25   96      servidorB       CPU Libre
8/03/13 12:30   93      servidorB       CPU Libre
8/03/13 12:35   97      servidorB       CPU Libre
8/03/13 12:40   97      servidorB       CPU Libre
8/03/13 12:45   96      servidorB       CPU Libre
8/03/13 12:50   97      servidorB       CPU Libre
8/03/13 12:55   94      servidorB       CPU Libre
8/03/13 13:00   97      servidorB       CPU Libre
8/03/13 13:05   98      servidorB       CPU Libre
8/03/13 13:10   94      servidorB       CPU Libre
8/03/13 13:15   96      servidorB       CPU Libre
8/03/13 13:20   98      servidorB       CPU Libre
8/03/13 13:25   96      servidorB       CPU Libre
8/03/13 13:30   97      servidorB       CPU Libre
8/03/13 12:15   95      servidorA       SWAP Libre
8/03/13 12:20   95      servidorA       SWAP Libre
8/03/13 12:25   95      servidorA       SWAP Libre
8/03/13 12:30   95      servidorA       SWAP Libre
...
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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: Cambiar las columnas de una tabla (archivo csv)

Notapor tutoki » 2013-03-17 17:17 @762

Hola, explorer, como siempre perfecto.

Copio el código completo con la salida a ficheros y alguna pequeña modificación para adecuarlos a la fotoOriginal (el tema de los nombres de los servidores). Te paso unas dudas:

1.- A veces la sonda que recoge las métricas falla, y aparece un "No hay datos" en el volcado "$linea_ref->{"$nombre $metrica"}"
¿cómo me podría saltar esa línea?

2.- ¿Dónde debería cambiar esta cabecera: "CPU % libre % CPU Libre", por ejemplo, por "CPU_%_libre" ¿Se puede hacer con los datos generados por el módulo Text::CSV::Slurp? Lo digo porque no he sido capaz

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;
  4. use Text::CSV::Slurp;
  5. use Data::Dumper;
  6. ####################################################################################
  7. # Inicialización
  8. ####################################################################################
  9. #my @letras_servidores = 'A' .. 'R';
  10. my @nombre_servidores = ( 'trulf01', 'trulf02' );
  11. my @metricas = (
  12.         "CPU % libre % CPU Libre",
  13.         "SWAP % libre % SWAP Libre",
  14.         "RAM % libre % RAM Libre"
  15. );
  16.  
  17. my $nodatos = 'No hay datos';
  18. ####################################################################################
  19. ## Lectura del archivo
  20. ####################################################################################
  21. @ARGV == 1 or die "Uso: $0 <archivo CSV a procesar>\n";
  22. my $archivo_csv = shift;
  23. -f $archivo_csv or die "ERROR: el archivo $archivo_csv no existe\n";
  24.  
  25. my $datos_ref = Text::CSV::Slurp->load(
  26.         file       => $archivo_csv,
  27.         sep_char   => ';',
  28.         quote_char => '"'
  29. );
  30.  
  31. #say Dumper $datos_ref;    # mostraría estos datos
  32. ####################################################################################
  33. ## Salida Genera fichero csv formateado
  34. ####################################################################################
  35. open my $csv, '>', "new.csv";
  36. say $csv join ";" => qw( Timestamp Valor Entidad Metrica );
  37. for my $metrica (@metricas)
  38. {
  39.   NOMBRE:
  40.         for my $nombre (@nombre_servidores)
  41.         {
  42.                 for my $linea_ref ( @{$datos_ref} )
  43.                 {
  44.                         next NOMBRE
  45.                           if not exists $linea_ref->{"$nombre $metrica"};
  46.  
  47. #A veces la sonda que recoge las metricas, falla, y aparece un "No hay datos" en el volcado
  48. #Intente saltarme la linea con esta trozo de codigo, pero claro el salto es olimpico;-)
  49. #next NOMBRE
  50. # if $linea_ref->{"$nombre $metrica"} eq $nodatos;    # no funciona
  51.  
  52.                         say $csv join ";" => $linea_ref->{'Tiempo'},
  53.                           $linea_ref->{"$nombre $metrica"}, $nombre,
  54.                           $metrica,;
  55.                 }
  56.         }
  57. }
  58. close $csv;
  59.     __END__
  60.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Pongo también el fichero:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. Tiempo;trulf01 CPU % libre % CPU Libre;trulf01 CPU % libre Round Trip Time;trulf01 CPU % libre Status;trulf01 SWAP % libre % SWAP Libre;trulf01 SWAP % libre Round Trip Time;trulf01 SWAP % libre Status;trulf01 RAM % libre % RAM Libre;trulf01 RAM % libre Round Trip Time;trulf01 RAM % libre Status;trulf02 CPU % libre % CPU Libre;trulf02 CPU % libre Round Trip Time;trulf02 CPU % libre Status;trulf02 RAM % libre % RAM Libre;trulf02 RAM % libre Round Trip Time;trulf02 RAM % libre Status;trulf02 SWAP % libre % SWAP Libre;trulf02 SWAP % libre Round Trip Time;trulf02 SWAP % libre Status
  2. 9/03/13 10:52;No hay datos;4 sec;0;93;0 sec;0;64;0 sec;0;94;4,02 sec;0;61;0 sec;0;92;0 sec;0
  3. 9/03/13 10:57;No hay datos;4,02 sec;0;93;0 sec;0;64;0 sec;0;95;4 sec;0;61;0 sec;0;92;0 sec;0
  4. 9/03/13 11:02;No hay datos;4,02 sec;0;93;0 sec;0;64;0 sec;0;94;4,02 sec;0;61;0 sec;0;92;0 sec;0
  5. 9/03/13 11:07;No hay datos;4 sec;0;93;0 sec;0;64;0 sec;0;95;4,02 sec;0;61;0 sec;0;92;0 sec;0
  6. 9/03/13 11:12;No hay datos;4,02 sec;0;93;0 sec;0;64;0 sec;0;95;4 sec;0;61;0 sec;0;92;0 sec;0
  7. 9/03/13 11:17;No hay datos;4 sec;0;93;0 sec;0;64;0 sec;0;94;4 sec;0;61;0 sec;0;92;0 sec;0
  8. 9/03/13 11:22;No hay datos;4 sec;0;93;0 sec;0;64;0 sec;0;95;4,02 sec;0;61;0 sec;0;92;0 sec;0
  9. 9/03/13 11:27;No hay datos;4,02 sec;0;93;0 sec;0;64;0 sec;0;95;4 sec;0;61;0 sec;0;92;0 sec;0
  10. 9/03/13 11:32;No hay datos;4 sec;0;93;0 sec;0;64;0 sec;0;93;4,02 sec;0;61;0 sec;0;92;0 sec;0
  11. 9/03/13 11:37;96;4 sec;0;93;0 sec;0;64;0 sec;0;94;4,02 sec;0;61;0 sec;0;92;0 sec;0
  12. 9/03/13 11:42;98;4,02 sec;0;93;0 sec;0;64;0 sec;0;93;4 sec;0;61;0 sec;0;92;0 sec;0
  13. 9/03/13 11:47;94;4 sec;0;93;0 sec;0;64;0 sec;0;93;4 sec;0;61;0 sec;0;92;0 sec;0
  14. 9/03/13 11:52;94;4 sec;0;93;0 sec;0;64;0 sec;0;95;4 sec;0;61;0 sec;0;92;0 sec;0
  15. 9/03/13 11:57;97;4,02 sec;0;93;0 sec;0;64;0 sec;0;94;4,02 sec;0;61;0 sec;0;92;0 sec;0
  16. 9/03/13 12:02;94;4 sec;0;93;0 sec;0;64;0 sec;0;94;4 sec;0;61;0 sec;0;92;0 sec;0
  17. 9/03/13 12:07;92;4,02 sec;0;93;0 sec;0;64;0 sec;0;95;4 sec;0;61;0 sec;0;92;0 sec;0
  18. 9/03/13 12:12;91;4 sec;0;93;0 sec;0;64;0 sec;0;94;4,02 sec;0;61;0 sec;0;92;0 sec;0
  19. 9/03/13 12:17;97;4 sec;0;93;0 sec;0;64;0 sec;0;95;4,02 sec;0;61;0 sec;0;92;0 sec;0
  20. 9/03/13 12:22;94;4 sec;0;93;0 sec;0;64;0 sec;0;94;4 sec;0;61;0 sec;0;92;0 sec;0
  21. 9/03/13 12:27;96;4,02 sec;0;93;0 sec;0;64;0 sec;0;95;4 sec;0;61;0 sec;0;92;0 sec;0
  22. 9/03/13 12:32;93;4 sec;0;93;0 sec;0;64;0 sec;0;88;4,02 sec;0;61;0 sec;0;92;0 sec;0
  23. 9/03/13 12:37;97;4 sec;0;93;0 sec;0;64;0 sec;0;95;4,05 sec;0;61;0 sec;0;92;0,02 sec;0
  24. 9/03/13 12:42;98;4,02 sec;0;93;0 sec;0;64;0 sec;0;95;4 sec;0;61;0 sec;0;92;0 sec;0
  25. 9/03/13 12:47;97;4 sec;0;93;0 sec;0;64;0 sec;0;95;4 sec;0;61;0 sec;0;92;0 sec;0
  26. 9/03/13 12:52;97;4,02 sec;0;93;0 sec;0;64;0 sec;0;95;4 sec;0;61;0 sec;0;92;0 sec;0
  27. 9/03/13 12:57;94;4,02 sec;0;93;0 sec;0;64;0 sec;0;94;4 sec;0;61;0 sec;0;92;0 sec;0
  28. 9/03/13 13:02;94;4 sec;0;93;0 sec;0;64;0 sec;0;93;4,02 sec;0;61;0 sec;0;92;0 sec;0
  29. 9/03/13 13:07;97;4 sec;0;93;0,05 sec;0;64;0 sec;0;95;4 sec;0;61;0 sec;0;92;0 sec;0
  30. 9/03/13 13:12;97;4 sec;0;93;0 sec;0;64;0 sec;0;95;4,02 sec;0;61;0 sec;0;92;0 sec;0
  31. 9/03/13 13:17;97;4 sec;0;93;0 sec;0;64;0 sec;0;93;4 sec;0;61;0 sec;0;92;0 sec;0
  32. 9/03/13 13:22;98;4,02 sec;0;93;0 sec;0;64;0 sec;0;95;4 sec;0;61;0 sec;0;92;0 sec;0
  33. 9/03/13 13:27;93;4,02 sec;0;93;0 sec;0;64;0 sec;0;94;4,02 sec;0;61;0 sec;0;92;0 sec;0
  34. 9/03/13 13:32;94;4,02 sec;0;93;0 sec;0;64;0 sec;0;93;4 sec;0;61;0 sec;0;92;0 sec;0
  35. 9/03/13 13:37;97;4,02 sec;0;93;0 sec;0;64;0 sec;0;95;4 sec;0;61;0 sec;0;92;0 sec;0
  36. 9/03/13 13:42;98;4,02 sec;0;93;0 sec;0;64;0 sec;0;95;4 sec;0;61;0 sec;0;92;0 sec;0
  37. 9/03/13 13:47;97;4 sec;0;93;0 sec;0;64;0 sec;0;94;4 sec;0;61;0 sec;0;92;0 sec;0
  38. 9/03/13 13:52;94;4,02 sec;0;93;0 sec;0;64;0 sec;0;95;4 sec;0;61;0 sec;0;92;0 sec;0
  39. 9/03/13 13:57;94;4 sec;0;93;0 sec;0;64;0 sec;0;95;4 sec;0;61;0 sec;0;92;0 sec;0
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
tutoki
Perlero nuevo
Perlero nuevo
 
Mensajes: 58
Registrado: 2012-04-15 01:53 @120

Re: Módulos para sacar promedios, valor más alto, más bajo.

Notapor tutoki » 2013-03-17 20:52 @911

Hola, explorer, al final me decidí por Statistic::Lite

Este código pretende sacar el máximo, mínimo y media de cada 12 (son 12 a la hora) medidas de cada hora y esos tres valores meterlos en un array para luego poder hacer gráficos, etc. Estos tres valores van asociados al nombre de su Entidad y al Timestamp (24 h).

Como ejemplo la salida podría ser :
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Timestamp Valor     Metrica     Entidad
1           20      medio       trulf01
2           23      medio       trulf01
.
.
24
1           59      maximo      trulf01
2
.
.
24
1           12      minimo      trulf01  
2
.
24
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Lo que he avanzado:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;
  4. use Statistics::Lite qw(:all);
  5. use Data::Dumper;
  6. my @datos;
  7. my %datos;
  8. my @fechas;
  9. my @valores;
  10. ####################################################################################
  11. #   Lectura del fichero de entrada vía entrada estándar                            #
  12. ####################################################################################
  13. my $csv_a_procesar = shift;    # es igual a  shift @ARGV
  14. open my $fh, "<", $csv_a_procesar;
  15. <$fh>; # nos saltamos la primera linea
  16. while (<$fh>)
  17. {
  18.                 chomp;                  # muerdo el retorno de carro final
  19.                 @datos = split (/;/);
  20.                 push @fechas, $datos[0];
  21.                 push @valores, $datos[1];
  22.                 #$datos{ $datos[0] } = $datos[1];
  23.  
  24. }
  25. say Dumper @valores;
  26. say my $min= min (@valores), " minimo";
  27. say my $count = count (@valores), " contador\t";
  28. say my $max= max (@valores), " maximo\t";
  29. say my $mean= mean (@valores), " media\t";
  30.  
  31.  
  32. close $fh;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Adjunto un fichero para probar.

Gracias de antemano.

SALUD...
Adjuntos
repo_rev3.csv
(3.46 KiB) 53 veces
tutoki
Perlero nuevo
Perlero nuevo
 
Mensajes: 58
Registrado: 2012-04-15 01:53 @120

Re: Cambiar las columnas de una tabla (archivo csv)

Notapor explorer » 2013-03-18 18:05 @795

A mí sí que me funciona lo de 'No hay datos' :?

Te pongo una variación del programa que sí me funciona.

Una cosa: sería mejor que tuvieras claro qué quieres hacer, porque si no, vas cambiando de idea, y al final, no terminamos de resolverte el problema. Si desde el principio hubieras puesto el csv real, pues habríamos ahorrado tiempo... Bueno, es solo un consejo ;)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;
  4. use Text::CSV::Slurp;
  5. #use Data::Dumper;
  6.  
  7. ####################################################################################
  8. # Inicialización
  9. ####################################################################################
  10. my @nombre_servidores = ( 'trulf01', 'trulf02' );
  11. my %metricas = (                                           # transformaciones de métricas
  12.         'CPU % libre % CPU Libre'       => 'CPU_%_libre',
  13.         'SWAP % libre % SWAP Libre'     => 'SWP_%_libre',
  14.         'RAM % libre % RAM Libre'       => 'RAM_%_libre',
  15. );
  16. my $nodatos = 'No hay datos';
  17.  
  18.  
  19. ####################################################################################
  20. ## Lectura del archivo
  21. ####################################################################################
  22. @ARGV == 1 or die "Uso: $0 <archivo CSV a procesar>\n";
  23. my $archivo_csv = shift;
  24. -f $archivo_csv or die "ERROR: el archivo $archivo_csv no existe\n";
  25.  
  26. my $datos_ref = Text::CSV::Slurp->load(
  27.         file       => $archivo_csv,
  28.         sep_char   => ';',
  29.         quote_char => '"'
  30. );
  31.  
  32. #say Dumper $datos_ref;    # mostraría estos datos
  33.  
  34.  
  35. ####################################################################################
  36. ## Salida Genera fichero csv formateado
  37. ####################################################################################
  38. open my $CSV, '>', 'new.csv';
  39.  
  40. say $CSV join ";" => qw( Timestamp Valor Entidad Metrica );
  41.  
  42. for my $metrica (sort keys %metricas) {
  43.  
  44.     NOMBRE:
  45.     for my $nombre (@nombre_servidores) {
  46.  
  47.         for my $linea_ref (@{$datos_ref}) {
  48.  
  49.             next NOMBRE if not exists  $linea_ref->{"$nombre $metrica"};
  50.             next        if $nodatos eq $linea_ref->{"$nombre $metrica"};
  51.  
  52.             say $CSV
  53.                 join ";" =>
  54.                     $linea_ref->{'Tiempo'},
  55.                     $linea_ref->{"$nombre $metrica"},
  56.                     $nombre,
  57.                     $metricas{$metrica},
  58.             ;
  59.         }
  60.     }
  61. }
  62.  
  63. close $CSV;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Del csv mostrado, me sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Timestamp;Valor;Entidad;Metrica
9/03/13 11:37;96;trulf01;CPU_%_libre
9/03/13 11:42;98;trulf01;CPU_%_libre
9/03/13 11:47;94;trulf01;CPU_%_libre
9/03/13 11:52;94;trulf01;CPU_%_libre
9/03/13 11:57;97;trulf01;CPU_%_libre
9/03/13 10:52;94;trulf02;CPU_%_libre
9/03/13 10:57;95;trulf02;CPU_%_libre
9/03/13 11:02;94;trulf02;CPU_%_libre
9/03/13 11:07;95;trulf02;CPU_%_libre
9/03/13 11:12;95;trulf02;CPU_%_libre
9/03/13 11:17;94;trulf02;CPU_%_libre
9/03/13 11:22;95;trulf02;CPU_%_libre
9/03/13 11:27;95;trulf02;CPU_%_libre
9/03/13 11:32;93;trulf02;CPU_%_libre
9/03/13 11:37;94;trulf02;CPU_%_libre
9/03/13 11:42;93;trulf02;CPU_%_libre
9/03/13 11:47;93;trulf02;CPU_%_libre
9/03/13 11:52;95;trulf02;CPU_%_libre
9/03/13 11:57;94;trulf02;CPU_%_libre
9/03/13 10:52;64;trulf01;RAM_%_libre
9/03/13 10:57;64;trulf01;RAM_%_libre
9/03/13 11:02;64;trulf01;RAM_%_libre
9/03/13 11:07;64;trulf01;RAM_%_libre
9/03/13 11:12;64;trulf01;RAM_%_libre
9/03/13 11:17;64;trulf01;RAM_%_libre
9/03/13 11:22;64;trulf01;RAM_%_libre
9/03/13 11:27;64;trulf01;RAM_%_libre
9/03/13 11:32;64;trulf01;RAM_%_libre
9/03/13 11:37;64;trulf01;RAM_%_libre
9/03/13 11:42;64;trulf01;RAM_%_libre
9/03/13 11:47;64;trulf01;RAM_%_libre
9/03/13 11:52;64;trulf01;RAM_%_libre
9/03/13 11:57;64;trulf01;RAM_%_libre
9/03/13 10:52;61;trulf02;RAM_%_libre
9/03/13 10:57;61;trulf02;RAM_%_libre
9/03/13 11:02;61;trulf02;RAM_%_libre
9/03/13 11:07;61;trulf02;RAM_%_libre
9/03/13 11:12;61;trulf02;RAM_%_libre
9/03/13 11:17;61;trulf02;RAM_%_libre
9/03/13 11:22;61;trulf02;RAM_%_libre
9/03/13 11:27;61;trulf02;RAM_%_libre
9/03/13 11:32;61;trulf02;RAM_%_libre
9/03/13 11:37;61;trulf02;RAM_%_libre
9/03/13 11:42;61;trulf02;RAM_%_libre
9/03/13 11:47;61;trulf02;RAM_%_libre
9/03/13 11:52;61;trulf02;RAM_%_libre
9/03/13 11:57;61;trulf02;RAM_%_libre
...
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
y ya se ve que las líneas sin datos no salen, y que las métricas han cambiado.
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: Módulos para sacar promedios, valor más alto, más bajo.

Notapor explorer » 2013-03-18 19:27 @852

¡Vaya! Ahora nos reencontramos con la salida del otro programa :D

Lo dicho: sería mejor tener una idea clara, antes, de todo el proceso, pues, a lo mejor, los dos programas/problemas se pueden realizar/resolver en uno solo ;)

Bueno, no pasa nada por trocear un problema grande en otros más pequeños, pero no es tan efectivo como tenerlo todo en uno solo. Incluso la realización de las gráficas se puede hacer también con Perl (hay varias bibliotecas para la creación de este tipo de gráficos, como la GD::Simple, o usar herramientas prefabricadas como RDD o MRTG (también hay módulos para hablar con ellas) que generan gráficas muy completas.

He encontrado otro módulo para hacer estadísticas, que es más moderno, aunque depende de más módulos: Statistics::Basic.
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: Cambiar las columnas de una tabla (archivo csv)

Notapor tutoki » 2013-03-19 13:34 @607

Hola, explorer. Tienes razón, intento poner ejemplo sencillos para que se entienda lo que quiero hacer y posiblemente termine mareando al personal. Intentaré que no vuelva a ocurrir.

Jope, era fácil el cambio de las cabeceras.

Respecto al tema del campo que "No hay datos", no funciona. Ojo: no funciona desde el punto de vista que nos comemos datos, es decir, para el servidor trulf01, hay valores de CPU_%_libre que deben tratarse. En el archivo de ejemplo (el último csv enviado), desde las líneas 11 al 15, son datos buenos que deben de ser tratados.

La idea es que se borren las líneas (horizontales) que contengan el campo "No hay datos".

SALUD...
tutoki
Perlero nuevo
Perlero nuevo
 
Mensajes: 58
Registrado: 2012-04-15 01:53 @120

Re: Módulos para sacar promedios, valor más alto, más bajo.

Notapor tutoki » 2013-03-19 13:58 @623

Hola, explorer.

Para bien o para mal, trabajo de modo modular. Si solo tuviera una fuente de datos, todo sería más fácil.

RECOJO DATOS - INTERPRETACIÓN - GENERO XML - MONTAJE HTML - COMPRIMO - ENVIO POR CORREO o SCP

Desde GENERO XML (incluido) no hago cambio importantes en el código. Son como librerías. El problema viene cuando me llegan cvs (formato) que GENERO XML no sabe tratar. Ni qué decir tiene que este módulo me ayudaste a crearlo tu.

Y es aquí donde nos encontramos con un nuevo tipo de formato que tiene que ver con este hilo y el otro al que hacer referencia.

Para la visualiazión utilizo FusionChart. ¡Ojo!, no genero imágenes sino archivos XML que luego computo en el momento de abrir el HTML. Estos gráficos están vivos, NO son imágenes, tooltip, leyendas, drilldown. No he encontrado nada mejor que esto. Mucho Javacript.

El problema de generar gráficos nos lleva a otro problema que es la cantidad de datos a tratar, imagina datos cada 5 minutos. CPU, memoria y swap son 3 x 5 x 12 x 24 x 30 días al mes, multiplícalo por cada servidor y..., por eso lo de generar medias, máximos y mínimos en la INTERPRETACIÓN.

Espero haber aclarado el tema. Cualquier duda, coméntamela, por favor.

SALUD...
tutoki
Perlero nuevo
Perlero nuevo
 
Mensajes: 58
Registrado: 2012-04-15 01:53 @120

Re: Cambiar las columnas de una tabla (archivo csv)

Notapor explorer » 2013-03-19 14:29 @645

tutoki escribiste:Respecto al tema del campo que "No hay datos", no funciona. Ojo: no funciona desde el punto de vista que nos comemos datos, es decir, para el servidor trulf01, hay valores de CPU_%_libre que deben tratarse. En el archivo de ejemplo (el último csv enviado), desde las líneas 11 al 15, son datos buenos que deben de ser tratados.
¡Ah!, cierto.

Ya he reeditado el programa y ya salen las líneas buenas.
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: Cambiar las columnas de una tabla (archivo csv)

Notapor tutoki » 2013-03-19 17:26 @768

Perfecto, gracias.


SALUD...
tutoki
Perlero nuevo
Perlero nuevo
 
Mensajes: 58
Registrado: 2012-04-15 01:53 @120

Re: Módulos para sacar promedios, valor más alto, más bajo.

Notapor tutoki » 2013-03-23 19:41 @862

Copio esta nueva aproximación a lo que busco. Aunque supongo que se puede hacer de muchas maneras el programa tal cual saca medias por hora, agrupa datos, en este caso de 12 en 12 (hay 12 valores por hora) y saca el máximo, el mínimo y la media de cada agrupación, luego debe de mostrar esos datos.

¿Es mejorable? ¿Qué os parece? ¿Sería más fácil hacerlo con otros módulos?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;
  4. use Statistics::Lite qw(:all);
  5. use Data::Dumper;
  6. my @datos;
  7. my %datos;
  8. my (@Timestamp, @Valor, @Entidad, @Metrica); # Cabeceras
  9. my (@min, @count, @max, @mean); # Estadísticas
  10. my $GRUPO = 12; # Constante de agrupación de Valor
  11. my @operadores = (
  12.         "minimo",
  13.         "maximo",
  14.         "media"
  15.         );
  16. #my $cont;
  17. ####################################################################################
  18. #   Lectura del fichero de entrada vía entrada estándar                            #
  19. ####################################################################################
  20. my $csv_a_procesar = shift;    # es igual a  shift @ARGV
  21. open my $fh, "<", $csv_a_procesar;
  22. <$fh>;                         # nos saltamos la primera línea
  23. while ( my $input = <$fh> )
  24. {
  25.  
  26.  # do { $line = <IN> } until $. ==  1  or  eof;  # nos saltamos la primera línea
  27.         chomp $input;
  28.  
  29.         #if ( $input =~ /\D/ ){next;}
  30.         @datos = split( /;/, $input );
  31.  
  32.         push( @Timestamp,$datos[0] );
  33.         push( @Valor,    $datos[1] );
  34.         push( @Entidad,  $datos[2] );
  35.         push( @Metrica,  $datos[3] );
  36.        
  37. }
  38.  
  39. #say Dumper (@Valor);
  40.         my $i = 0;
  41.         my $o = $GRUPO - 1;
  42. for (my $f = 0; $f <= $#Valor; $f += $GRUPO) {
  43.         # discrimino el último bucle si no existen los doce datos a operar
  44.         if ($GRUPO <= $#Valor) {
  45.         push @min,   min(@Valor[$i..$o]); # 0..12 , 13..
  46.         push @count, count(@Valor[$i..$o]);
  47.         push @max,   max(@Valor[$i..$o]);
  48.         #push @mean,  mean(@Valor[$i..$o]);
  49.         push @mean,  sprintf ("%d", (mean(@Valor[$i..$o])) + 0.5); # redondeo
  50.  
  51.         $i += $GRUPO;
  52.         $o += $GRUPO;
  53.         #$cont += 1;
  54.         }
  55. }
  56. close $fh;
  57.  
  58. say join "\t" => 'minimos', @min;
  59. say join "\t" => 'maximos', @max;
  60. #say 'contadores';
  61. #say join "\t" => @count;
  62. say join "\t" => 'medias', @mean;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



Aparte el programa tiene un pequeño agujero: se basa en que el fichero origen sea perfecto, es decir, si por algún motivo no tuviera doce valores por hora pues... los resultado aunque ciertos estaría fuera del rango por hora que era el fin del programa.

Lo que se me está complicando es el formato de salida de los datos. No me sale. Os anexo tanto el fichero original con datos y el final que es como quiero que me salga.

Echarme un cable, por favor.

Gracias de antemano.

SALUD...

salida_final.csv
salida de datos
(2.09 KiB) 58 veces
entrada.csv
Entrada de datos
(6.97 KiB) 48 veces
Hola a todos,
tutoki
Perlero nuevo
Perlero nuevo
 
Mensajes: 58
Registrado: 2012-04-15 01:53 @120

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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

cron