• 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: Módulos para sacar promedios, valor más alto, más bajo.

Notapor explorer » 2013-03-25 17:29 @770

A mi me parece bien, salvo algunos detalles:
  • las variables @Timestamp, @Entidad y @Metrica te sobran, pues no los están usando para nada. Podrían servir si quieres sacar estadísticas según la métrica de cada línea
  • el segundo bucle se puede simplificar un poco. Por ejemplo, la variable $o no es más que $i+$GRUPO-1
  • no hace falta comprobar si el último corte es de exactamente $GRUPO elementos: Perl devolverá los elementos que pueda. Otra cosa es que quieras descartar ese último corte si realmente no tiene $GRUPO elementos
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

Publicidad

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

Notapor tutoki » 2013-03-25 20:01 @875

Hola explorer,

* Sobrar, sobrar... luego tengo que construir el archivo salida_final_csv y supongo que me hará falta.
* Correcto, muy agudo.
* Efectivamente debe de ser así, si no las medias del último grupo saldría mal. Bueno no mal, más bien no coherentes.

Estoy atascado en la salida del fichero csv, al poner otro campo en la lista -> @operadores, pues me armo un taco.

He estado viendo ejemplos anteriores y no me ayudan.

Otro tema es el de cambiar la salida del campo Tiempo. Como son medidas de cada hora, debería salir 9/03/13 11:00, 9/03/13 12:00..., o bien 9/03/13 11, 9/03/13 12... por ejemplo. En este segundo paso podría utilizar $str = substr($string,0,-3); para quitar los tres últimos dígitos. ¿Qué te parece?


Hay un ejemplo de salida añadido en el hilo anterior.



Gracias de antemano

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 explorer » 2013-03-26 08:05 @378

La variable @operadores no se usa en ningún sitio...

Según el archivo de entrada, hay datos de varios servidores, así que supongo que las estadísticas hay que sacarlas según por cada servidor, ¿no? Y solo hay una métrica, pero quizás el problema completo implique más de una métrica, ¿no?
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: Módulos para sacar promedios, valor más alto, más bajo.

Notapor tutoki » 2013-03-26 22:02 @960

Hola explorer, efectivamente hay más de una métrica, hay tres: máximo, mínimo y media, lo que me complica enormemente la generación de los ficheros XML.

El quid de la cuestión es que el generador de XML solo trabaja con cuatro operadores:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my %log;
  2.  
  3. for my $item (@$datos)
  4. {
  5.         my ( $dia, $mes, $year, $hora, $minuto) =
  6.           $item->{Timestamp} =~ /(\d+)/g;
  7.         $item->{Timestamp} =
  8.           sprintf "%02d" . "/" . "%02d" . "/" . "%02d" . " " . "%02d" . ":" . "%02d" , $year, $mes, $dia,       $hora, $minuto;
  9.  
  10.         $log{ $item->{Entidad} }
  11.         ->{ $item->{Metrica} }
  12.         # ->{ $item->{Operador} }
  13.         ->{ $item->{Timestamp} } =
  14.           $item->{Valor};
  15. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Le llevo dando vueltas varias horas y al final creo que la solución más coherente es modificar el csv de entrada al generador XML (que es la salida CSV de este hilo)

Esta sería la salida que pedía en este hilo (que no funciona con el generador XML)
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Timestamp;Valor;Operador;Entidad;Metrica
9/03/13 11:00;92;minimo;trulf01;CPU_%_libre
9/03/13 11:00;98;maximo;trulf01;CPU_%_libre
9/03/13 11:00;96;media;trulf01;CPU_%_libre
9/03/13 11:00;92;minimo;trulf02;CPU_%_libre
9/03/13 11:00;98;maximo;trulf02;CPU_%_libre
9/03/13 11:00;96;media;trulf02;CPU_%_libre
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Cambiado a este formato/salida, volvemos a tener una sola métrica, este es el formato que necesito para generar los gráficos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Timestamp;Valor;Entidad;Metrica
9/03/13 11:00;92;trulf01;CPU_%_libre_minimo
9/03/13 11:00;98;trulf01;CPU_%_libre_maximo
9/03/13 11:00;96;trulf01;CPU_%_libre_media
9/03/13 11:00;92;trulf02;CPU_%_libre_minimo
9/03/13 11:00;98;trulf02;CPU_%_libre_maximo
9/03/13 11:00;96;trulf02;CPU_%_libre_media
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Y todos contentos, a parte de ser fiel a los principios de poder reutilizar código.

Te pego el generador XML, por si quieres echarle un ojo ( te sonará)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;  
  4. #use Data::Dumper;
  5. use Text::CSV::Slurp;
  6. use XML::Simple;
  7.  
  8. my $n = 0;
  9.  
  10. ####################################################################################
  11. ## Constantes
  12. ####################################################################################
  13. my %medidas = (
  14.         cpu => {
  15.                 caption       => "Uso de la CPU",
  16.                 xAxisName     => "Mensual",
  17.                 yAxisName     => "% uso cpu",
  18.                 yAxisMaxvalue => "100",
  19.                 datos         => [
  20.                         qw(
  21.                           CPU_%_libre_minimo
  22.                           CPU_%_libre_maximo
  23.                           CPU_%_libre_media
  24.                           )
  25.                 ],
  26.         },
  27.         # mem => {
  28.         #       caption   => "Uso de la memoria",
  29.         #       xAxisName => "Mensual",
  30.         #       yAxisName => "% uso Memoria",
  31.         #       datos     => [
  32.         #               qw(
  33.         #                 RAM_%_libre
  34.         #                 SWAP_%_libre
  35.         #                 )
  36.         #       ],
  37.         # },
  38. );
  39.  
  40. ####################################################################################
  41. ## Argumentos
  42. ####################################################################################
  43. @ARGV == 1 or die "Uso: $0 <archivo CSV a procesar>\n";
  44.  
  45. my $archivo_csv = shift;
  46.  
  47. ####################################################################################
  48. ## Lectura del archivo
  49. ####################################################################################
  50. my $datos = Text::CSV::Slurp->load(
  51.         file       => $archivo_csv,
  52.         sep_char   => ';',
  53.         quote_char => '"'
  54. );
  55.  
  56. my %log;
  57.  
  58. for my $item (@$datos)
  59. {
  60.         my ( $dia, $mes, $year, $hora, $minuto) =
  61.           $item->{Timestamp} =~ /(\d+)/g;
  62.         $item->{Timestamp} =
  63.           sprintf "%02d" . "/" . "%02d" . "/" . "%02d" . " " . "%02d" . ":" . "%02d" , $year, $mes, $dia,       $hora, $minuto;
  64.  
  65.        
  66.         $log{ $item->{Entidad} }
  67.         ->{ $item->{Metrica} }
  68.         # ->{ $item->{Operador} }
  69.         ->{ $item->{Timestamp} } =
  70.           $item->{Valor};
  71. }
  72. #say Dumper \%log;
  73. ####################################################################################
  74. ## Salida
  75. ####################################################################################
  76. for my $maquina ( keys %log )
  77. {    # por cada máquina
  78.         say $maquina;
  79.  
  80.         for my $medida ( keys %medidas )
  81.         {    # por cada medida
  82.                 say "\t$medida";
  83.  
  84.                 # la raíz de todos los males
  85.                 my $xml = {
  86.                         chart => {
  87.                                 showValues => 0,
  88.                                 caption    => $medidas{$medida}->{caption} . " " . $maquina, # los que no llevan $variables son comunes a todos los grafico
  89.                                 xAxisName     => $medidas{$medida}->{xAxisName},
  90.                                 yAxisName     => $medidas{$medida}->{yAxisName},
  91.                                 yAxisMaxvalue => $medidas{$medida}->{yAxisMaxvalue},
  92.  
  93.                                 #paletteColors => "042936,006D9C,5DCF76,3F8A4F",
  94.  
  95.                                 palette => 2,
  96.  
  97.                                 #showToolTip => 1,
  98.                                 numDivLines => 8,
  99.  
  100.                                 inThousandSeparator => ".",
  101.                                 inDecimalSeparator  => ",",
  102.  
  103.                                 #decimalSeparator  => ",",
  104.                                 #thousandSeparator => ".",
  105.                                 decimals        => "2",
  106.                                 legendIconScale => "1",    #Tamaño icono de cada leyenda
  107.                                 legendCaption => "Servidores Fisicos",    #Titulo
  108.                                 showExportDataMenuItem => "1",    #Copiar datos al portapapeles
  109.                                 drawAnchors => "0",    #Quita el punto de dato (circulo) y el toolTip
  110.                                 categories =>
  111.                                   {       # modelo para añadir o modificar atributos del XML
  112.                                         fontSize => 8,
  113.                                   }
  114.                         }
  115.                 };
  116.  
  117.                 # fechas
  118.                 my @fechas =
  119.                   sort keys %{ $log{$maquina}->{ ${ $medidas{$medida}->{datos} }[0] } };
  120.  
  121.                 $xml->{chart}->{categories}->{category} =
  122.                   [ map { { label => $_ } } @fechas ];
  123.  
  124.                 # por cada magnitud
  125.                 for my $item ( @{ $medidas{$medida}->{datos} } )
  126.                 {
  127.                         say "\t\t$item";
  128.  
  129.                         # sacamos el conjunto de datos, para esas fechas
  130.                         my @set =
  131.                           map { { value => $log{$maquina}->{$item}->{$_} } } @fechas;
  132.  
  133.                         push @{ $xml->{chart}->{dataset} },
  134.                           {
  135.                                 SeriesName => $item,
  136.                                 set        => [@set],
  137.                           };
  138.                 }
  139.  
  140.                 open my $SALIDA, '>', "data/fisico/"
  141.                   . "${maquina}_$medida.xml";    # /vm/${maquina}_$medida.xml
  142.                 print $SALIDA XMLout( $xml, KeepRoot => 1 );
  143.                 close $SALIDA;
  144.  
  145.                 ##############################################################
  146.                 # Generar estructura HTML
  147.                 ##############################################################
  148.                 open my $html, '>>', "tmpl/" . "dgpe_fisico_medias.tmpl";    # /vm/dgpe_vm.tmpl
  149.                 $n += 1;
  150.                 my $chartid = "ChartIdFIMed" . "_" . $n;
  151.                 say $html
  152. qq(                                                             <span id="${maquina}_$medida">FusionCharts will load here!</span>
  153.                                                                 <script type="text/javascript" >
  154.                                                                         /*FusionCharts.setCurrentRenderer('javascript');*/
  155.                                                                         var myChart = new FusionCharts("fusion/MSLine.swf",
  156.                                                                                         "$chartid ","1100", "600", "0", "1");
  157.                                                                         myChart.setXMLUrl("data/fisico/${maquina}_$medida.xml");
  158.                                                                         myChart.render("${maquina}_$medida");
  159.                                                                 </script>);
  160.  
  161.         }
  162. }
  163.  
  164.     __END__  
  165.    
  166.  
  167.  
Coloreado en 0.005 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-27 21:34 @940

Hola, he añadido algunas constantes para luego crear el csv, y variado la parte estadística (max, min y media) para que vaya al mismo array. Pero... no va, ¿alguna idea?



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 ( @max, @min, @mean );
  10. my @operacion;                         # Estadísticas
  11. my $GRUPO = 12;                        # Constante de agrupación de Valor
  12. my @operadores = ( "CPU_%_libre_minimo", "CPU_%_libre_maximo", "CPU_%_libre_media" );
  13. my @nombre_servidores = ( 'trulf01', 'trulf02' );
  14. my @tiempo_horas      = (
  15.     "9/03/13 11:00",
  16.     "9/03/13 12:00",
  17.     "9/03/13 13:00",
  18.     "9/03/13 14:00",
  19.     "9/03/13 15:00",
  20.     "9/03/13 16:00",
  21.     "9/03/13 17:00",
  22.     "9/03/13 18:00"
  23. );
  24.  
  25. #my $cont;
  26. ####################################################################################
  27. #   Lectura del fichero de entrada vía entrada estándar                           #
  28. ####################################################################################
  29. my $csv_a_procesar = shift;            # es igual a  shift @ARGV
  30. open my $fh, "<", $csv_a_procesar;
  31. <$fh>;                                 # nos saltamos la primera línea
  32. while ( my $input = <$fh> ) {
  33.  
  34.     # do { $line = <IN> } until $. ==  1  or  eof;  # nos saltamos la primera línea
  35.     chomp $input;
  36.  
  37.     #if ( $input =~ /\D/ ){next;}
  38.     @datos = split( /;/, $input );
  39.  
  40.     # push( @Timestamp,$datos[0] );
  41.     push( @Valor, $datos[1] );
  42.  
  43.     # push( @Entidad,    $datos[2] );
  44.     # push( @Metrica,    $datos[3] );
  45.  
  46. }
  47.  
  48. #say Dumper (@Valor);
  49. my $i = 0;
  50. my $o = $GRUPO - 1;
  51. for ( my $f = 0; $f <= $#Valor; $f += $GRUPO ) {
  52.  
  53.     # discrimino el último bucle si no existen los doce datos a operar
  54.     if ( $GRUPO <= $#Valor ) {
  55.         push @operacion, min( @Valor[ $i .. $o ] );                                # 0..12 , 13..
  56.         push @operacion, max( @Valor[ $i .. $o ] );
  57.         push @operacion, sprintf( "%d", ( mean( @Valor[ $i .. $o ] ) ) + 0.5 );    # redondeo
  58.  
  59.         # lo dejo para que se vean lo datos estadísticos a modo de test
  60.         push @min,  min( @Valor[ $i .. $o ] );                                     # 0..12 , 13..
  61.         # push @count, count(@Valor[$i..$o]);
  62.         push @max,  max( @Valor[ $i .. $o ] );
  63.         push @mean, sprintf( "%d", ( mean( @Valor[ $i .. $o ] ) ) + 0.5 );         # redondeo
  64.  
  65.         $i += $GRUPO;
  66.         $o += $GRUPO;
  67.  
  68.         #$cont += 1;
  69.     }
  70. }
  71. close $fh;
  72.  
  73. #say $cont;
  74. #say $#Valor;
  75. #say Dumper @min;
  76.  
  77. say join "\t" => qw( Timestamp Valor  Entidad  Operacion);
  78.  
  79. for my $operador (@operadores) {
  80.     for my $nombre (@nombre_servidores) {
  81.         for my $operar (@operacion) {
  82.             for my $tiempo (@tiempo_horas) {
  83.  
  84.                 say join "\t" => $tiempo, $operar, $nombre, $operador,;
  85.             }
  86.         }
  87.     }
  88. }
  89.  
  90. #salida estadísticas para test
  91. say join "\t" => 'minimos', @min;
  92. say join "\t" => 'maximos', @max;
  93.  
  94. #say 'contadores';
  95. #say join "\t" => @count;
  96. say join "\t" => 'medias', @mean;
  97.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4



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 explorer » 2013-03-30 10:39 @485

El problema es que no concuerda el orden impuesto por los bucles for del final con el orden de creación del array @operacion.

En el array estás metiendo el resultado de las operaciones mínimo, máximo y media, sin tener en cuenta si los valores pertenecen a qué servidor o a qué lapso de tiempo.

Quizás la solución sea crear ahí una estructura de datos más compleja, a base de hashes, que guarde la información generada, y luego ya sí se puede recorrer con los bucles. De esa manera no se mezclarán los resultados.

A propósito, hace unos minutos acaba de aparecer un módulo en CPAN para el cálculo de estadísticas en archivos con campos delimitados, como los CSV: App::LogStats. Incluye un script llamado stats, para ser ejecutado desde la línea de comandos.
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: Módulos para sacar promedios, valor más alto, más bajo.

Notapor tutoki » 2013-03-31 14:44 @656

Hola, efectivamente no están bien ordenado, lo he probado en de varios modos y no va. He probado a dar tiempos estáticos creando un array a ver si iban por ahí los tiros, sin éxito.


El tema como ves es cómo incluir las listas de máximos, mínimos y media en el bucle de salida. No sé cómo hacerlo. Aparte que como ves en la conversación de este hilo debe de salir algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Timestamp;Valor;Entidad;Metrica
9/03/13 11:00;92;trulf01;CPU_%_libre_minimo
9/03/13 11:00;98;trulf01;CPU_%_libre_maximo
9/03/13 11:00;96;trulf01;CPU_%_libre_media
9/03/13 11:00;92;trulf02;CPU_%_libre_minimo
9/03/13 11:00;98;trulf02;CPU_%_libre_maximo
9/03/13 11:00;96;trulf02;CPU_%_libre_media
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Vi el código del amigo Dai Okabayashi, le he enviado un correo a ver si me puede aclarar un duda que tengo.

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-04-01 17:23 @766

Hola, ya me contestó el amigo DAI https://metacpan.org/author/BAYASHI Para separar por cualquier otro delimitar que no sea la coma hay que utilizar -d (obvio) pero hay que poner entre comillas el delimitador.

$ stats -d";" -f1,2 your_log

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 explorer » 2013-04-01 20:45 @906

Hay un problema, y gordo...

Del ejemplo de archivo de entrada que pusiste, si nos fijamos en la línea primera, con las cabeceras, y las colocamos agrupadas por servidor, vemos esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
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
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Vemos que en el servidor trulf02, los datos de la RAM salen antes que los de la SWAP, que es diferente orden que en el caso del servidor trulf01.

Primero debes resolver este asunto, antes de seguir con el resto.
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: Módulos para sacar promedios, valor más alto, más bajo.

Notapor tutoki » 2013-04-03 18:36 @817

Hola, aunque tienes razón, no veo cuál es el problema.

Copio los datos de entrada
entrada.csv
datos en bruto
(165.91 KiB) 36 veces


Veo que has unido este hilo a otro mio, bien, en este hilo se creó un programa que lo que hacía era borrar datos sin utilidad y líneas donde por algún motivo no se habían recogido datos.

Es este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #Convierte de csv a csv
  3. use v5.14;
  4. use autodie;
  5. use Text::CSV::Slurp;
  6. #use Data::Dumper;
  7.      
  8. ####################################################################################
  9. # Inicialización
  10. ####################################################################################
  11. my @nombre_servidores = ( 'trulf01', 'trulf02' );
  12. my %metricas = (                                           # transformaciones de métricas
  13.         'CPU % libre % CPU Libre'       => 'CPU_%_libre',
  14.         'SWAP % libre % SWAP Libre'     => 'SWAP_%_libre',
  15.         'RAM % libre % RAM Libre'       => 'RAM_%_libre',
  16. );
  17. my $nodatos = 'No hay datos';
  18.    
  19.    
  20. ####################################################################################
  21. ## Lectura del archivo
  22. ####################################################################################
  23. @ARGV == 1 or die "Uso: $0 <archivo CSV a procesar>\n";
  24. my $archivo_csv = shift;
  25. -f $archivo_csv or die "ERROR: el archivo $archivo_csv no existe\n";
  26.  
  27. my $datos_ref = Text::CSV::Slurp->load(
  28.         file       => $archivo_csv,
  29.         sep_char   => ';',
  30.         quote_char => '"'
  31. );
  32.    
  33.    #say Dumper $datos_ref;    # mostraría estos datos
  34.    
  35.    
  36. ####################################################################################
  37. ## Salida Genera fichero csv formateado
  38. ####################################################################################
  39. open my $CSV, '>', "salida.csv";
  40.  
  41. say $CSV join ";" => qw( Timestamp Valor Entidad Metrica );
  42.  
  43. for my $metrica (sort keys %metricas) {
  44.    
  45.     NOMBRE:
  46.     for my $nombre (@nombre_servidores) {
  47.  
  48.         for my $linea_ref (@{$datos_ref}) {
  49.  
  50.             next NOMBRE if not exists  $linea_ref->{"$nombre $metrica"};
  51.             next        if $nodatos eq $linea_ref->{"$nombre $metrica"};
  52.  
  53.             say $CSV
  54.                 join ";" =>
  55.                     $linea_ref->{'Tiempo'},
  56.                     $linea_ref->{"$nombre $metrica"},
  57.                     $nombre,
  58.                     $metricas{$metrica},
  59.             ;
  60.         }
  61.     }
  62. }
  63.  
  64. close $CSV;
  65.  __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El fichero resultante que copio:
salida.csv
csv formateado
(445.55 KiB) 34 veces


Esta ordenado por la columna Metrica, Entidad... y los datos se corresponden al fichero entrada.csv. Los datos son correctos. No veo el problema que comentas

Luego, la segunda parte de este hilo, intenta agrupar los datos por horas (de este fichero salida.csv), calculando por cada hora, la media, máximo y mínimo de los datos, creando otro fichero csv que se debe de parecer a esto, copio un trozo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Timestamp;Valor;Entidad;Metrica
9/03/13 11:00;25;trulf01;CPU_%_libre_minimo
9/03/13 12:00;26;trulf01;CPU_%_libre_minimo
9/03/13 11:00;27;trulf02;CPU_%_libre_minimo
9/03/13 12:00;28;trulf02;CPU_%_libre_minimo
9/03/13 11:00;95;trulf01;CPU_%_libre_maximo
9/03/13 12:00;96;trulf01;CPU_%_libre_maximo
9/03/13 11:00;97;trulf02;CPU_%_libre_maximo
9/03/13 12:00;98;trulf02;CPU_%_libre_maximo
9/03/13 11:00;60;trulf01;CPU_%_libre_media
9/03/13 12:00;61;trulf01;CPU_%_libre_media
9/03/13 11:00;62;trulf02;CPU_%_libre_media
9/03/13 12:00;63;trulf02;CPU_%_libre_media
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Y es donde nos encontramos, el módulo que he utilizado para las estadísticas es Statistics::Lite, con el soy capaz de sacar los máximos, mínimos y medias, que aunque de una manera un tanto, llamémosla manual (las agrupaciones de los datos de cada horas las realizo porque sé exactamente cuántos valores hay en cada hora). He explorado otros módulos como Date::Calc para ver si esta agrupación la podría hace de una manera más lógica, sin éxito.

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 (@max,@min,@mean);
  10. my @operacion; # Estadisticas
  11. my $GRUPO = 12; # Constante de agrupacion de Valor
  12. my @operadores = (
  13.         "CPU_%_libre_minimo",
  14.         "CPU_%_libre_maximo",
  15.         "CPU_%_libre_media"
  16.         );
  17. my @nombre_servidores = ( 'trulf01', 'trulf02' );
  18.  
  19. #my $cont;
  20. ####################################################################################
  21. #   LEctura del fichero de entrada via entrada estandard                           #
  22. ####################################################################################
  23. my $csv_a_procesar = shift;    # es igual a  shift @ARGV
  24. open my $fh, "<", $csv_a_procesar;
  25. <$fh>;                         # nos saltamos la primera linea
  26. while ( my $input = <$fh> )
  27. {
  28.  
  29.  # do { $line = <IN> } until $. ==  1  or  eof;  # nos saltamos la primera linea
  30.         chomp $input;
  31.  
  32.         #if ( $input =~ /\D/ ){next;}
  33.         @datos = split( /;/, $input );
  34.  
  35.         # push( @Timestamp,$datos[0] );
  36.          push( @Valor,   $datos[1] );
  37.         # push( @Entidad,        $datos[2] );
  38.         # push( @Metrica,        $datos[3] );
  39.        
  40. }
  41.  
  42. #say Dumper (@Valor);
  43.         my $i = 0;
  44.         my $o = $GRUPO - 1;
  45. for (my $f = 0; $f <= $#Valor; $f += $GRUPO) {
  46.         # discrimino el ultimo bucle si no exiten los doce datos a operar
  47.         if ($GRUPO <= $#Valor) {
  48.        
  49.         # lo dejo para que se vean lo datos estadisticos
  50.         push @min,   min(@Valor[$i..$o]); # 0..12 , 13..
  51.         # push @count, count(@Valor[$i..$o]);
  52.         push @max,   max(@Valor[$i..$o]);
  53.         push @mean,  sprintf ("%d", (mean(@Valor[$i..$o])) + 0.5); # redondeo
  54.  
  55.         $i += $GRUPO;
  56.         $o += $GRUPO;
  57.         #$cont += 1;
  58.         }
  59. }
  60. close $fh;
  61. #say $cont;
  62. #say $#Valor;
  63. #say Dumper @min;
  64.  
  65. say join "\t" => qw( Timestamp Valor  Entidad  Operacion);
  66.  
  67. ################################
  68. #montaje del fichero de salida
  69. ###################################
  70. #falta
  71.  
  72.                
  73. #salida estadísticas para test        
  74. say join "\t" =>  'minimos', @min;
  75. say join "\t" => 'maximos', @max;
  76. #say 'contadores';
  77. #say join "\t" => @count;
  78. say join "\t" => 'medias', @mean;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

SALUD....
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: Bing [Bot] y 28 invitados