• 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.

Cambiar las columnas de una tabla (archivo csv)

Notapor tutoki » 2013-03-13 19:50 @868

Hola, necesito cambiar el orden de los datos de un csv a otro csv, ¿por qué? porque el resultado final ya lo tengo mecanizado para generar un archivo xml con el que genero gráficas.

Aparte de leer el fichero y generar un array con los datos leídos no sé cómo tratarlo para cambiarlo, aparte hay varias columnas de datos que no me interesan que formen parte de la fotofinal. Columnas cuya cabecera contiene la palabra Status o Round.

Anexo dos ficheros, fotoinicial y fotofinal para que se me entienda (mejor).

Sintáxis: (fotoinicial.csv) [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Tiempo;servidor A CPU Libre;servidor A CPU Libre Round Trip Time;servidor A CPU Libre Status;servidor A  SWAP Libre;servidor A  SWAP Libre Round Trip Time;servidor A  SWAP Libre Status;servidor A  RAM Libre;servidor A  RAM Libre Round Trip Time;servidor A  RAM Status
8/03/13 12:15;92;4 sec;0;95;0 sec;0;62;0 sec;0
8/03/13 12:20;97;4,05 sec;0;95;0 sec;0;62;0 sec;0
8/03/13 12:25;96;4,02 sec;0;95;0 sec;0;62;0 sec;0
8/03/13 12:30;93;4 sec;0;95;0 sec;0;62;0 sec;0
8/03/13 12:35;97;4 sec;0;95;0 sec;0;62;0 sec;0
8/03/13 12:40;97;4,02 sec;0;95;0 sec;0;62;0 sec;0
8/03/13 12:45;96;4 sec;0;95;0 sec;0;62;0 sec;0
8/03/13 12:50;97;4 sec;0;95;0 sec;0;62;0 sec;0
8/03/13 12:55;94;4,02 sec;0;95;0 sec;0;62;0 sec;0
8/03/13 13:00;97;4,02 sec;0;95;0 sec;0;62;0 sec;0
8/03/13 13:05;98;4,02 sec;0;95;0 sec;0;62;0 sec;0
8/03/13 13:10;94;4 sec;0;95;0 sec;0;62;0 sec;0
8/03/13 13:15;96;4,02 sec;0;95;0 sec;0;62;0 sec;0
8/03/13 13:20;98;4,02 sec;0;95;0 sec;0;62;0 sec;0
8/03/13 13:25;96;4,02 sec;0;95;0 sec;0;62;0 sec;0
8/03/13 13:30;97;4 sec;0;95;0 sec;0;62;0 sec;0
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Sintáxis: (fotofinal.csv) [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
timestamp;Equipo;CPU libre;SWAP libre;RAM libre
8/03/13 12:15;Servidor A;92;95;62
8/03/13 12:20;Servidor A;97;95;62
8/03/13 12:25;Servidor A;96;95;62
8/03/13 12:30;Servidor A;93;95;62
8/03/13 12:35;Servidor A;97;95;62
8/03/13 12:40;Servidor A;97;95;62
8/03/13 12:45;Servidor A;96;95;62
8/03/13 12:50;Servidor A;97;95;62
8/03/13 12:55;Servidor A;94;95;62
8/03/13 13:00;Servidor A;97;95;62
8/03/13 13:05;Servidor A;98;95;62
8/03/13 13:10;Servidor A;94;95;62
8/03/13 13:15;Servidor A;96;95;62
8/03/13 13:20;Servidor A;98;95;62
8/03/13 13:25;Servidor A;96;95;62
8/03/13 13:30;Servidor A;97;95;62
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Gracias por anticipado

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

Publicidad

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

Notapor explorer » 2013-03-13 22:25 @976

Bueno, es sencillo leer del primer archivo solo las columnas que nos interesan y sacarlas hacia el nuevo archivo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while (<$FOTOINICIAL>) {
  2.     my($timestamp, $CPU, undef, undef, $SWAP, undef, undef, $RAM) = split /[;]/;
  3.     say $FOTOFINAL join ";" => $timestamp, "Servidor A", $CPU, $SWAP, $RAM;
  4. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Incluso hasta se puede hacer desde la misma línea de comandos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -anE 'BEGIN { say "timestamp;Equipo;CPU libre;SWAP libre;RAM libre"; } next if $. == 1; my($timestamp, $CPU, undef, undef, $SWAP, undef, undef, $RAM) = split /[;]/; say join ";" => $timestamp, "Servidor A", $CPU, $SWAP, $RAM' fotoinicial.csv > fotofinal.csv
Coloreado en 0.002 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: 14486
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-15 13:01 @584

Buena jugada; he añadido a tu código la lectura y escritura del fichero y funciona perfectamente.

Por complicar el asunto, y posiblemente la estrategia de análisis, la realidad es que el fichero que tengo que tratar salvo el campo tiempo/timestamp, se repite la secuencia para más servidores (18), es decir, habría un servidor B, C, D, E, F,... (hasta 18) con sus métricas cpu, ram y swap.

Anexo un ejemplo por si no se entiende, del fichero fotoinicial (formato csv).

Supongo que tenemos que crear un bucle para que secuencialmente trate cada conjunto de categorías de datos (datos pertenecientes a cada servidor).

Gracias por anticipado

SALUD...
Sintáxis: (fotoinicial.csv) [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. Tiempo;servidor A CPU Libre;servidor A CPU Libre Round Trip Time;servidor A CPU Libre Status;servidor A SWAP Libre;servidor A SWAP Libre Round Trip Time;servidor A SWAP Libre Status;servidor A RAM Libre;servidor A RAM Libre Round Trip Time;servidor A RAM Status;servidor B CPU Libre;servidor B CPU Libre Round Trip Time;servidor B CPU Libre Status;servidor B SWAP Libre;servidor B SWAP Libre Round Trip Time;servidor B SWAP Libre Status;servidor B RAM Libre;servidor B RAM Libre Round Trip Time;servidor B RAM Status
  2. 8/03/13 12:15;92;4 sec;0;95;0 sec;0;62;0 sec;0;92;4 sec;0;95;0 sec;0;62;0 sec;0
  3. 8/03/13 12:20;97;4,05 sec;0;95;0 sec;0;62;0 sec;0;97;4,05 sec;0;95;0 sec;0;62;0 sec;0
  4. 8/03/13 12:25;96;4,02 sec;0;95;0 sec;0;62;0 sec;0;96;4,02 sec;0;95;0 sec;0;62;0 sec;0
  5. 8/03/13 12:30;93;4 sec;0;95;0 sec;0;62;0 sec;0;93;4 sec;0;95;0 sec;0;62;0 sec;0
  6. 8/03/13 12:35;97;4 sec;0;95;0 sec;0;62;0 sec;0;97;4 sec;0;95;0 sec;0;62;0 sec;0
  7. 8/03/13 12:40;97;4,02 sec;0;95;0 sec;0;62;0 sec;0;97;4,02 sec;0;95;0 sec;0;62;0 sec;0
  8. 8/03/13 12:45;96;4 sec;0;95;0 sec;0;62;0 sec;0;96;4 sec;0;95;0 sec;0;62;0 sec;0
  9. 8/03/13 12:50;97;4 sec;0;95;0 sec;0;62;0 sec;0;97;4 sec;0;95;0 sec;0;62;0 sec;0
  10. 8/03/13 12:55;94;4,02 sec;0;95;0 sec;0;62;0 sec;0;94;4,02 sec;0;95;0 sec;0;62;0 sec;0
  11. 8/03/13 13:00;97;4,02 sec;0;95;0 sec;0;62;0 sec;0;97;4,02 sec;0;95;0 sec;0;62;0 sec;0
  12. 8/03/13 13:05;98;4,02 sec;0;95;0 sec;0;62;0 sec;0;98;4,02 sec;0;95;0 sec;0;62;0 sec;0
  13. 8/03/13 13:10;94;4 sec;0;95;0 sec;0;62;0 sec;0;94;4 sec;0;95;0 sec;0;62;0 sec;0
  14. 8/03/13 13:15;96;4,02 sec;0;95;0 sec;0;62;0 sec;0;96;4,02 sec;0;95;0 sec;0;62;0 sec;0
  15. 8/03/13 13:20;98;4,02 sec;0;95;0 sec;0;62;0 sec;0;98;4,02 sec;0;95;0 sec;0;62;0 sec;0
  16. 8/03/13 13:25;96;4,02 sec;0;95;0 sec;0;62;0 sec;0;96;4,02 sec;0;95;0 sec;0;62;0 sec;0
  17. 8/03/13 13:30;97;4 sec;0;95;0 sec;0;62;0 sec;0;97;4 sec;0;95;0 sec;0;62;0 sec;0
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
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-15 15:59 @707

tutoki escribiste:Supongo que tenemos que crear un bucle para que secuencialmente trate cada conjunto de categorías de datos (datos pertenecientes a cada servidor).
Depende del orden en que quieras sacar los datos. Si quieres respetar el timestamp, habrá que guardar todos los datos, para luego hacer un bucle por todos los servidores, repitiendo los datos de timestamp. En fin, es cuestión de extraer los datos, guardarlos y luego sacarlos según el orden elegido.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
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-15 17:43 @779

Humm, bueno, el caso es que la única cabecera buena es Timestamp, por ejemplo la siguiente cabecera servidorA CPU Libre no me vale, realmente aquí hay dos valores; uno, la Entidad servidorA, y el otro es la siguiente cabecera: la Metrica CPU Libre.

Fotoinicial:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Timestamp       servidor A CPU Libre    servidor A CPU Libre Round Trip Time    servidor A CPU Libre Status     servidor A SWAP Libre   servidor A SWAP Libre Round Trip Time   servidor A SWAP Libre Status    servidor A RAM Libre    servidor A RAM Libre Round Trip Time    servidor A RAM Status
8/03/13 12:15   92      4 sec   0       95      0 sec   0       62      0 sec   0
8/03/13 12:20   97      4,05 sec        0       95      0 sec   0       62      0 sec   0
8/03/13 12:25   96      4,02 sec        0       95      0 sec   0       62      0 sec   0
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Fotofinal
Debería de quedar así:
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:15   94        servidorB       CPU Libre            
8/03/13 12:20   92        servidorB       CPU Libre                      
8/03/13 12:25   99        servidorB       CPU Libre
8/03/13 12:15   62        servidorA       RAM Libre            
8/03/13 12:20   67        servidorA       RAM Libre                      
8/03/13 12:25   66        servidorA       RAM Libre
8/03/13 12:15   68        servidorB       RAM Libre            
8/03/13 12:20   67        servidorB       RAM Libre                      
8/03/13 12:25   62        servidorB       RAM Libre
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Con este modelo es muy fácil generar gráficos.

No sé si lo aclaro o lo embrollo más.

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

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

Notapor tutoki » 2013-03-15 17:53 @787

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...
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-15 20:00 @875

¿Algún ejemplo de cómo son los datos de entrada y la salida esperada?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
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-15 20:49 @909

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
tutoki
Perlero nuevo
Perlero nuevo
 
Mensajes: 58
Registrado: 2012-04-15 01:53 @120

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

Notapor tutoki » 2013-03-16 09:05 @420

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.002 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....
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-16 15:52 @703

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron