Página 1 de 4

Cambiar las columnas de una tabla (archivo csv)

NotaPublicado: 2013-03-13 19:50 @868
por tutoki
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...

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

NotaPublicado: 2013-03-13 22:25 @976
por explorer
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

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

NotaPublicado: 2013-03-15 13:01 @584
por tutoki
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

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

NotaPublicado: 2013-03-15 15:59 @707
por explorer
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.

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

NotaPublicado: 2013-03-15 17:43 @779
por tutoki
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...

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

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.