Página 1 de 4

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

NotaPublicado: 2013-03-15 17:53 @787
por tutoki
Hola,

Alguna recomendación para usar módulos relacionados con cálculo de promedios de datos (horas, días, semanas), máximo valor, mínimo valor, etc.

SALUD...

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

NotaPublicado: 2013-03-15 20:00 @875
por explorer
¿Algún ejemplo de cómo son los datos de entrada y la salida esperada?

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

NotaPublicado: 2013-03-15 20:49 @909
por tutoki
Hola, los datos se pueden generar cada 5 minutos, es decir, 12 mediciones a la hora (o 24 cada dos horas si por ejemplo estoy tratando datos de más de un mes), de esas 12 (o 24) mediciones quiero sacar la media, el valor más alto y el más bajo por cada hora (estas tres son estándar en la visualización de gráficos de rendimiento/capacidad de cualquier equipo/servidor), y guardarlas en un formato digamos especial del cual genero gráficos.

La entrada será un fichero.csv y la salida otro.

He visto Statistics::Descriptive pero... buff yo buscaba algo más sencillo.


SALUD... Carlos Pascual

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

NotaPublicado: 2013-03-16 09:05 @420
por tutoki
Hola.

Añado comentarios al código.

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. @ARGV == 1 or die "Uso: $0 <archivo CSV a procesar>\n";
  9.  
  10. my $archivo_csv = shift;
  11.  
  12. ####################################################################################
  13. ## Lectura del archivo
  14. ####################################################################################
  15. my $datos = Text::CSV::Slurp->load(
  16.         file       => $archivo_csv,
  17.         sep_char   => ';',
  18.         quote_char => '"'
  19. );
  20. #say Dumper \$datos; # mostraría estos datos
  21. #'servidorA  RAM Libre' => '62',
  22. #'servidorA  RAM Libre Round Trip Time' => '0 sec',
  23. #'servidorA CPU Libre' => '92',
  24. #'servidorA  RAM Status' => '0',
  25. #'servidorA CPU Libre Round Trip Time' => '4 sec',
  26. #'servidorA CPU Libre Status' => '0',
  27. #'Tiempo' => '8/03/13 12:15',
  28. #'servidorA  SWAP Libre' => '95',
  29. #'servidorA  SWAP Libre Round Trip Time' => '0 sec',
  30. #'servidorA  SWAP Libre Status' => '0'
  31. ####################
  32. # en este bloque dejaria fuera las columnas que no me interesan, que son las que
  33. # contienen en sus cabeceras Round o Status
  34. for my $item (@$datos){
  35.         if ( $item =~ m/Round/ ) { next };
  36.  
  37.         if ( $item =~ m/Status/ ) { next };
  38. }
  39. say Dumper \$datos; #no funciona, debería de mostrar estos datos
  40. #'servidorA  RAM Libre' => '62',
  41. #'servidorA CPU Libre' => '92',
  42. #'Tiempo' => '8/03/13 12:15',
  43. #'servidorA  SWAP Libre' => '95',
  44. ####################
  45. ####################
  46. #ahora el asunto que las cabeceras ( la primera línea de array hay que cambiarla y extraer datos que formarían algo así:
  47. #'servidorA' => 'RAM Libre' => '62',
  48. #'servidorA ' =>'CPU Libre' => '92',
  49. #'Tiempo' => '8/03/13 12:15',
  50. #'servidorA' => 'SWAP Libre' => '95',
  51. ####################
  52.  
  53. #ahora formatearía los datos
  54. my %log;
  55. #unshift(@$datos, 'Timestamp','Valor','Metrica','Entidad');
  56.  
  57. for my $item (@$datos)
  58. {if ( $. == 1 )
  59.         {next}
  60.         unshift(@$datos, 'Timestamp','Valor','Metrica','Entidad');
  61.        
  62.        
  63.         my ( $dia, $mes, $year, $hora, $minuto, $segundo ) =
  64.           $item->{Timestamp} =~ /(\d+)/g;
  65.         $item->{Timestamp} =
  66.           sprintf "%02d" . "/" . "%02d" . "/" . "%02d" . " " . "%02d" . ":" . "%02d"
  67.           . ":"
  68.           . "%02d", $year, $mes, $dia, $hora, $minuto, $segundo;
  69.        
  70.           $log { $item -> {Timestamp} }
  71.              ->{ $item->{Metrica     } }
  72.              ->{ $item->{Entidad     } }
  73.              = $item -> {Valor};
  74.  
  75. }
  76.  
  77. say Dumper \%log;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Por último comentar que en el fichero real hay más de un servidor/métrica, pongo solo un equipo y tres métricas para que se entienda mejor.

Hasta aquí llego. ¿Alguna luz?

SALUD....

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

NotaPublicado: 2013-03-16 15:52 @703
por explorer
En este enlace hay ejemplo de un programa que hace diversos cálculos para una lista de números en punto flotante.

Más abajo hay otra respuesta que enlaza con módulos de la rama Statistics::

El último comentario que aparece es cuando el volumen de datos a procesar es enorme. Entonces hay que pensar en usar la biblioteca matemática PDL.

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

NotaPublicado: 2013-03-16 16:43 @738
por explorer
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.002 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.000 segundos, usando GeSHi 1.0.8.4

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

NotaPublicado: 2013-03-17 17:17 @762
por tutoki
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

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

NotaPublicado: 2013-03-17 20:52 @911
por tutoki
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...

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

NotaPublicado: 2013-03-18 18:05 @795
por explorer
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.

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

NotaPublicado: 2013-03-18 19:27 @852
por explorer
¡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.