• Publicidad

Parseando CSV

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

Parseando CSV

Notapor tutoki » 2012-10-09 17:03 @752

Hola, segun voy avanzando en esto de Perl me van surgiendo dudas que os expongo.

Tengo un fichero data.csv (que anexo), que después de tratarlo con Perl, creará varios ficheros xml que luego se convertirán en gráficos.

En este csv, se recogen varios valores, digamos principales:

campo(0) : "value" valor del dato, lo que aparece en la gráfica
campo(1) : "Timestamp" tiempo Eje X (día)
campo(2) : "MetricId" Eje Y (8 valores diferentes, agrupados en 3)

Son estos:
1ª agrupación -> @grupocpu = qw(cpu.ready.summation cpu.usage.average);

2ª agrupación -> @grupomem = qw(mem.active.average mem.consumed.average mem.granted.average mem.vmmemctl.average);

3ª agrupación -> @grupoio = qw(datastore.totalreadlatency.average datastore.totalwritelatency.average);

TODO Completo -> @stats = qw(cpu.ready.summation cpu.usage.average datastore.totalreadlatency.average datastore.totalwritelatency.average mem.active.average mem.consumed.average mem.granted.average mem.vmmemctl.average) ;


campo(5) : "Entity" Elemento sobre el que se realizan los cálculos (3 servidores)

@maquinas = qw (ropo01 ropo02 sav01)

Esto quiere decir que a cada cambio del campo 5 se deben de generar los hash relacionados con las agrupaciones de datos similares para poder generar los XML. En total serían 9 ficheros (3 elementos/servidores * 3 agrupaciones de datos similares).

¿Cómo lo hago? Genero 3 hash diferentes donde la clave sea el tiempo, es decir campo 1.

¿Cómo ataco este problema?

Gracias por anticipado.

Luego tengo que generar los XML, lo vemos más adelante.
Adjuntos
data.csv
(46.27 KiB) 64 veces
tutoki
Perlero nuevo
Perlero nuevo
 
Mensajes: 58
Registrado: 2012-04-15 01:53 @120

Publicidad

Re: Parseando CSV

Notapor explorer » 2012-10-09 18:01 @792

Yo creo que la estructura debería ser:
  • un hash cuyas claves son las entidades, ya que son ellos el objeto principal de estudio
  • los valores de estos hash deberían ser una referencia a otro hash, cuyas claves serían el valor de MetricId
    los valores de estos hash serían otra referencia a otro hash, cuyas claves serían los valores de Timestamp. Y sus valores, los del campo Value correspondiente

De esa manera, tendríamos algo así (una estructura tridimensional):

$datos{"ropo01"}->{"cpu.usage.average"}->{"09/10/2012 18:00:00"} = "1,35";

con lo que sería fácil recorrer, excepto en los Timestamp, que no tienen un formato estándar. Casi mejor transformarlos antes a un formato ISO 8601: "09/10/2012 18:00:00" => "20120910T180000", y así ya puedes, con un for y un sort, sacar los datos ordenados por fecha y hora.
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: Parseando CSV

Notapor tutoki » 2012-10-10 17:37 @776

Estructura tridimensional, humm, intento acercarme a tus consejos, ( no muy acertadamente ;-) )

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #use warnings;
  3. #use strict;
  4. use Time::Local;
  5. use v5.14;
  6. use autodie;
  7.  
  8. my @datos;
  9. my %datos;
  10. my @Maquinas;
  11. my %Maquinas;
  12. my @Metricas;
  13. my %data;
  14.  
  15. ####################################################################################
  16. #   Listas de variables a usar                                                     #
  17. ####################################################################################
  18.  
  19. #my @grupocpu = qw ( cpu_ready_summation cpu_usage_average);
  20. #my @grupomem = qw ( mem_active_average mem_consumed_average mem_granted_average mem_vmmemctl_average);
  21. #my @grupoio = qw ( datastore_totalreadlatency_average datastore_totalwritelatency_average);
  22. my @stats
  23.     = qw ( cpu_ready_summation cpu_usage_average datastore_totalreadlatency_average datastore_totalwritelatency_average mem_active_average mem_consumed_average mem_granted_average mem_vmmemctl_average);
  24.  
  25. #my @maquinas = qw (ropo01 ropo02 sav01);
  26.  
  27. ####################################################################################
  28. #   LEctura del fichero de entrada via entrada estandard                           #
  29. ####################################################################################
  30. my $csv_a_procesar = shift;            # es igual a  shift @ARGV
  31.  
  32. open my $fh, "<", $csv_a_procesar;
  33.  
  34. ## Lectura
  35.  
  36. while (<$fh>) {
  37.  
  38.     if ( $_ =~ /^"Value"/ ) {          # Nos saltamos la primera linea
  39.         next;
  40.     }
  41.     else {
  42.         chomp;                            # muerdo el retorno de carro final
  43.         s/"//g;                           # Borro las comillas
  44.         my @datos = split( ";", $_ );     # separo los campos
  45.         $datos[0] =~ s/"//g,  $datos[0];     # Value
  46.        $datos[1] =~ s/ /-/g, $datos[1];     # Timestamp
  47.        $datos[1] =~ s/-(\d):/-0$1:/;        # Transformo fecha
  48.        $datos[2] =~ s/\./_/g, $datos[2];    # MetricId
  49.        my $Maquinas = $datos[5];            # Entity
  50.        my $Metricas = $datos[2];
  51.        $data{"$Maquinas"}->{"$Metricas"}->{"$datos[1]"} = $datos[0];
  52.    }
  53. }
  54.  
  55. close $fh;
  56.  
  57. # Imprime los datos
  58. foreach my $data ( keys %data ) {
  59.    say "$data = $data{%data}";        # no muestra lo que yo quiero
  60. }
  61.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2012-10-10 18:21 @806, editado 1 vez en total
Razón: Formateado de código con Perltidy
tutoki
Perlero nuevo
Perlero nuevo
 
Mensajes: 58
Registrado: 2012-04-15 01:53 @120

Re: Parseando CSV

Notapor explorer » 2012-10-10 19:03 @835

Ya... pero... ¿qué quieres sacar, y de qué forma?

Si se trata de una estructura tridimensional, debes acceder a ella de la misma manera en que la has creado.

Si quieres ver la estructura que se ha creado, puedes hacerle un Dumper:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Data::Dumper;
  2. print Dumper(\%data);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Con eso verificas que la estructura está bien creada.
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: Parseando CSV

Notapor tutoki » 2012-10-11 00:28 @061

Hola, explorer.
Necesito generar ficheros xml con los valores de estos datos.

ropo01
#cpu.ready.summation
#cpu.usage.average

ropo01
#datastore.totalreadlatency.average
#datastore.totalwritelatency.average

ropo01
#mem.active.average
#mem.consumed.average
#mem.granted.average
#mem.vmmemctl.average

ropo02..... igual que el anterior

sav01...... igual que el anterior

Con estos datos generaría varios XML, en este caso 9 ficheros ( 3 agrupaciones x 3 máquinas = 9) que entiendo se podría hacer en un bucle ( o en tres, uno por tipo de XML cpu., datastore., mem.)

Un ejemplo de XML:
#ropo01
#cpu.ready.summation
#cpu.usage.average
#####################################
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  ## Salida
  2.     open my $fhout, ">", "ropo01.xml";
  3.      
  4.     say $fhout
  5.         ' <chart showvalue="0" caption="Prueba con poco datos" xaxisname="tiempo" yaxisname="datos" palette="1">';
  6.      
  7.     say $fhout ' <categories>';
  8.      
  9.     for my $date (@fechas) {
  10.         say $fhout qq(            <category label="$date" />);
  11.     }
  12.      
  13.     say $fhout ' </categories>';
  14.      
  15.     say $fhout ' <dataset SeriesName="cpu.ready.summation">';
  16.      
  17.     for my $date (@fechas) {
  18.         say $fhout qq(            <set value="$datos{$date}" />);
  19.     }
  20.      
  21.     say $fhout ' </dataset>';
  22.     say $fhout ' <dataset SeriesName="cpu.usage.average">';
  23.      
  24.     for my $date (@fechas) {
  25.         say $fhout qq(            <set value="$datos{$date}" />);
  26.     }
  27.      
  28.     say $fhout ' </dataset>';
  29.     say $fhout ' </chart>';
  30.      
  31.     close $fhout;
  32.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2012-10-11 01:55 @121, editado 1 vez en total
Razón: Marcas de código Perl
tutoki
Perlero nuevo
Perlero nuevo
 
Mensajes: 58
Registrado: 2012-04-15 01:53 @120

Re: Parseando CSV

Notapor tutoki » 2012-10-12 13:30 @604

No sé si al final se entiende lo que estoy intentado hacer, cualquier ayuda será bienvenida.

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

Re: Parseando CSV

Notapor explorer » 2012-10-12 19:19 @846

La solución no es sencilla, porque se trata de una estructura tridimensional, de la que tenemos que modificar unos campos, y luego sacarlos de una determinada manera, y en un determinado orden. Y la sintaxis de Perl se complica a medida de que las estructuras se vuelven más complejas.

Esta es la primera solución, sin usar módulos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;              # activa programación estricta, salida de advertencias y nuevas características
  3. use autodie;            # «Mejor morir que regresar con deshonor» --Proverbio Kinglon
  4.  
  5. ####################################################################################
  6. ## Constantes
  7. ####################################################################################
  8. my %medidas = (
  9.     cpu => {
  10.         caption   => "Uso de la CPU",
  11.         xaxisname => "tiempo",
  12.         yaxisname => "CPU",
  13.         datos     => [qw(
  14.                         cpu_ready_summation
  15.                         cpu_usage_average
  16.                     )],
  17.     },
  18.     mem => {
  19.         caption   => "Uso de la memoria",
  20.         xaxisname => "tiempo",
  21.         yaxisname => "Memoria",
  22.         datos     => [qw(
  23.                         mem_active_average
  24.                         mem_consumed_average
  25.                         mem_granted_average
  26.                         mem_vmmemctl_average
  27.                     )],
  28.     },
  29.     io  => {
  30.         caption   => "Uso de la E/S",
  31.         xaxisname => "tiempo",
  32.         yaxisname => "E/S",
  33.         datos     => [qw(
  34.                         datastore_totalreadlatency_average
  35.                         datastore_totalwritelatency_average
  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. ####################################################################################
  49. ## Lectura del archivo
  50. ####################################################################################
  51. my %log;                # Almacena toda la información
  52. my @campos;             # Nombre de los campos, en el orden en que aparecen
  53. my %campos;             # Datos de cada línea
  54.  
  55. open my $INPUT, '<', $archivo_csv;
  56. while (<$INPUT>) {
  57.     chomp;
  58.     s/"//g;
  59.     my @datos = split /;/;                              # Separo los campos
  60.  
  61.     if ($. == 1) {                                      # Si es la primera línea
  62.         @campos = @datos;                               # Leemos los nombres de los campos
  63.     }
  64.     else {
  65.         @campos{@campos} = @datos;                      # %campos <- @datos
  66.  
  67.         my($dia, $mes, $year, $hora, $minuto, $segundo) = $campos{'Timestamp'} =~ /(\d+)/g;
  68.         $campos{'Timestamp'} = sprintf "%02d%02d%02dT%02d%02d%02d", $year, $mes, $dia, $hora, $minuto, $segundo;
  69.  
  70.         $campos{'MetricId'} =~ s/[.]/_/g;
  71.  
  72.         $log{ $campos{'Entity'} }->{ $campos{'MetricId'} }->{ $campos{'Timestamp'} } = $campos{'Value'};
  73.     }
  74. }
  75.  
  76. close   $INPUT;
  77.  
  78.  
  79. #use Data::Dumper;
  80. #say Dumper \%log;           # comprobar que se genera bien la estructura
  81.  
  82. ####################################################################################
  83. ## Salida
  84. ####################################################################################
  85. for my $maquina (keys %log) {                                   # por cada máquina
  86.  
  87.     say $maquina;
  88.  
  89.     for my $medida (keys %medidas) {                            # por cada medida
  90.         say "\t$medida";
  91.  
  92.         open my $SALIDA, '>', "${maquina}_$medida.xml";
  93.  
  94.         say $SALIDA
  95.             '<',
  96.             join(' ',
  97.                 'chart',
  98.                 'showvalue="0"',
  99.                 qq(caption="$medidas{$medida}->{caption}"),
  100.                 qq(xaxisname="$medidas{$medida}->{xaxisname}"),
  101.                 qq(yaxisname="$medidas{$medida}->{yaxisname}"),
  102.                 'palette="1"',
  103.             ),
  104.             '>'
  105.             ;
  106.                                                                 # fechas
  107.         say $SALIDA '  <categories>';
  108.         my @fechas = sort keys %{ $log{$maquina}->{ ${$medidas{$medida}->{datos}}[0] } };
  109.         for my $fecha (@fechas) {
  110.             say $SALIDA qq(    <category label="$fecha" />);
  111.         }
  112.         say $SALIDA '  </categories>';
  113.                                                                 # por cada magnitud
  114.         for my $item (@{ $medidas{$medida}->{datos}}) {
  115.             say "\t\t$item";
  116.  
  117.             say $SALIDA qq(  <dataset SeriesName="$item">);
  118.  
  119.             for my $fecha (@fechas) {
  120.                 say $SALIDA qq(    <set value="$log{$maquina}->{$item}->{$fecha}" />);
  121.             }
  122.  
  123.             say $SALIDA qq(  </dataset>);
  124.         }
  125.  
  126.         say $SALIDA '</chart>';
  127.  
  128.         close   $SALIDA;
  129.     }
  130. }
  131.  
  132. __END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Lo único reseñable es que usamos los campos de la primera línea del CSV (línea 62) para construir un hash (línea 65), y de esa manera, podemos acceder a los datos de las siguientes líneas sin tener que acordarnos que el 'Value' está en la posición 0, o el 'Timestamp' en el 1. Además, si en el futuro cambia de formato el CSV, el programa seguirá funcionando, aunque los campos cambien de posición.

Esta es otra solución, usando módulos y un poco más de Perl elaborado. Queda un poco más corta, claro.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;            # «Mejor morir que regresar con deshonor» --Proverbio Kinglon
  4.  
  5. use Text::CSV::Slurp;
  6. use XML::Simple;
  7.  
  8.  
  9. ####################################################################################
  10. ## Constantes
  11. ####################################################################################
  12. my %medidas = (
  13.     cpu => {
  14.         caption   => "Uso de la CPU",
  15.         xaxisname => "tiempo",
  16.         yaxisname => "CPU",
  17.         datos     => [qw(
  18.                         cpu_ready_summation
  19.                         cpu_usage_average
  20.                     )],
  21.     },
  22.     mem => {
  23.         caption   => "Uso de la memoria",
  24.         xaxisname => "tiempo",
  25.         yaxisname => "Memoria",
  26.         datos     => [qw(
  27.                         mem_active_average
  28.                         mem_consumed_average
  29.                         mem_granted_average
  30.                         mem_vmmemctl_average
  31.                     )],
  32.     },
  33.     io  => {
  34.         caption   => "Uso de la E/S",
  35.         xaxisname => "tiempo",
  36.         yaxisname => "E/S",
  37.         datos     => [qw(
  38.                         datastore_totalreadlatency_average
  39.                         datastore_totalwritelatency_average
  40.                     )],
  41.     },
  42. );
  43.  
  44. ####################################################################################
  45. ## Argumentos
  46. ####################################################################################
  47. @ARGV == 1 or die "Uso: $0 <archivo CSV a procesar>\n";
  48.  
  49. my $archivo_csv = shift;
  50.  
  51. ####################################################################################
  52. ## Lectura del archivo
  53. ####################################################################################
  54. my $datos = Text::CSV::Slurp->load(file => $archivo_csv, sep_char => ';', quote_char => '"');
  55.  
  56. my %log;
  57.  
  58. for my $item ( @$datos ) {
  59.     my($dia, $mes, $year, $hora, $minuto, $segundo) = $item->{Timestamp} =~ /(\d+)/g;
  60.     $item->{Timestamp} = sprintf "%02d%02d%02dT%02d%02d%02d", $year, $mes, $dia, $hora, $minuto, $segundo;
  61.     $item->{MetricId} =~ s/[.]/_/g;
  62.  
  63.     $log  { $item->{Entity   } }
  64.         ->{ $item->{MetricId } }
  65.         ->{ $item->{Timestamp} }
  66.         =   $item->{Value    };
  67. }
  68.  
  69.  
  70. ####################################################################################
  71. ## Salida
  72. ####################################################################################
  73. for my $maquina (keys %log) {                                   # por cada máquina
  74.     say $maquina;
  75.  
  76.     for my $medida (keys %medidas) {                            # por cada medida
  77.         say "\t$medida";
  78.  
  79.         # la raíz de todos los males
  80.         my $xml = {
  81.             chart => {
  82.                 showvalue       => 0,
  83.                 caption         => $medidas{$medida}->{caption  },
  84.                 xaxisname       => $medidas{$medida}->{xaxisname},
  85.                 yaxisname       => $medidas{$medida}->{yaxisname},
  86.                 palette         => 1,
  87.             }
  88.         };
  89.        
  90.         # fechas
  91.         my @fechas = sort keys %{ $log{$maquina}->{ ${$medidas{$medida}->{datos}}[0] } };
  92.  
  93.         $xml->{chart}->{categories}->{category} = [ map { { label => $_ } } @fechas ];
  94.  
  95.         # por cada magnitud
  96.         for my $item (@{ $medidas{$medida}->{datos}}) {
  97.             say "\t\t$item";
  98.  
  99.             # sacamos el conjunto de datos, para esas fechas
  100.             my @set = map { { value => $log{$maquina}->{$item}->{$_} } } @fechas;
  101.  
  102.             push @{ $xml->{chart}->{dataset} }, {
  103.                 SeriesName => $item,
  104.                 set        => [ @set ],
  105.             };
  106.         }
  107.  
  108.         open my $SALIDA, '>', "${maquina}_$medida.xml";
  109.         print   $SALIDA XMLout($xml, KeepRoot => 1);
  110.         close   $SALIDA;
  111.     }
  112. }
  113.  
  114. __END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Bueno, son solo veinte líneas menos, pero queda un poco más claro, y más fácil de mantener en el futuro.

La salida son los nueve archivos, con este aspecto:
Sintáxis: (sav01_cpu.xml) [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <chart caption="Uso de la CPU" palette="1" showvalue="0" xaxisname="tiempo" yaxisname="CPU">
  2.   <categories>
  3.     <category label="20121009T000000" />
  4.     <category label="20121009T020000" />
  5.     <category label="20121009T040000" />
  6.     <category label="20121009T060000" />
  7.     <category label="20121009T080000" />
  8.     <category label="20121009T100000" />
  9.     <category label="20121009T120000" />
  10.     <category label="20121009T140000" />
  11.     <category label="20121009T160000" />
  12.     <category label="20121009T180000" />
  13.   </categories>
  14.   <dataset SeriesName="cpu_ready_summation">
  15.     <set value="5557" />
  16.     <set value="5468" />
  17.     <set value="5243" />
  18.     <set value="5765" />
  19.     <set value="6066" />
  20.     <set value="6227" />
  21.     <set value="6385" />
  22.     <set value="5928" />
  23.     <set value="5893" />
  24.     <set value="5521" />
  25.   </dataset>
  26.   <dataset SeriesName="cpu_usage_average">
  27.     <set value="1,51" />
  28.     <set value="1,48" />
  29.     <set value="1,52" />
  30.     <set value="1,49" />
  31.     <set value="1,59" />
  32.     <set value="1,67" />
  33.     <set value="1,66" />
  34.     <set value="1,58" />
  35.     <set value="1,52" />
  36.     <set value="1,56" />
  37.   </dataset>
  38. </chart>
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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Parseando CSV

Notapor tutoki » 2012-10-12 19:21 @848

Este código (es de otra consulta que hice) que pego está adaptado a la consulta de este hilo.

En el hilo original era más fácil ya que solo había dos campos a tratar y no cambiaban.

El quid de la cuestión yo creo que está en el CSV que anexo, os copio un extracto.

Quizás el problema presentado es mas complejo de lo que yo pensaba y podemos dividir en trozos más sencillos para poder ir avanzando, el código intenta escribir en un fichero XML solo las métricas (MetricId) cpu.usage.average y cpu.ready.summation de ropo01 (Entity)

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
"Value";"Timestamp";"MetricId";"Unit";"Description";"Entity";
"1,35";"09/10/2012 18:00:00";"cpu.usage.average";"%";"CPU usage";"ropo01"
"5512";"09/10/2012 18:00:00";"cpu.ready.summation";"millisecond";"Percentage ;"ropo01"</span>
"4186112";"09/10/2012 18:00:00";"mem.granted.average";"KB";"memory ";"ropo01"
"84616";"09/10/2012 18:00:00";"mem.active.average";"KB";"memory actively";"ropo01"
"0";"09/10/2012 18:00:00";"mem.vmmemctl.average";"KB";"memory";"ropo01";
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use autodie;
  3. use Text::CSV::Slurp;
  4. use XML::Simple;
  5.  
  6. my $csv_a_procesar = shift
  7.     or die "Uso: $0 <nombre de fichero>\n";
  8.  
  9. my $data = Text::CSV::Slurp->load(                      # Leer archivo CSV
  10.     file        => $csv_a_procesar,
  11. #   quote_char  => q["],
  12.     sep_char    => q[;],
  13. );
  14.  
  15. my @category;
  16. my @set1;
  17. my @set2;
  18.  
  19. for my $data (@$data) {                                  
  20.     push @category,  { label => $data->{'Timestamp'} };  
  21.     push @set1,      { value => $data->{'Value'    } };#aquí habría que procesar solo los valores de cpu_ready_summation  
  22.     push @set2,      { value => $data->{'Value'    } };#aquí habría que procesar solo los valores de cpu_usage_average
  23. }
  24.  
  25. my $xml1 = {                                            # cabecera del XML
  26.         chart => {
  27.             showvalue   => 0,
  28.             caption     => 'Solo CPU',
  29.             xaxisname   => 'tiempo',
  30.             yaxisname   => 'datos',
  31.             palette     => 1,
  32.         }
  33.     };
  34.  
  35. my $xml2 = { category => \@category };                  # categories
  36.  
  37. my $xml3 = {                                            # dataset
  38.     dataset => {
  39.         SeriesName => 'cpu_ready_summation',                    # Aquí solo se deberían de escribir
  40.         set => \@set1,                                                                  # los datos de esta métrica en particular
  41.     }
  42. };
  43. my $xml4 = {                                            # dataset
  44.     dataset => {
  45.         SeriesName => 'cpu_usage_average',                              # Aquí solo se deberían de escribir
  46.         set => \@set2,                                                                  # los datos de esta métrica en particular
  47.     }
  48. };
  49.  
  50.  
  51. my $xml5 = {chart};
  52.  
  53. open my $fhout, ">", "test1.xml";    #salida
  54.  
  55. print   $fhout XMLout($xml1, KeepRoot => 0, RootName => '');
  56. print   $fhout XMLout($xml2, RootName => 'categories' );
  57. print   $fhout XMLout($xml3, KeepRoot => 1 );
  58. print   $fhout XMLout($xml4, KeepRoot => 1 );
  59. print   $fhout XMLout($xml5, RootName => '/chart' );
  60. close   $fhout;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
tutoki
Perlero nuevo
Perlero nuevo
 
Mensajes: 58
Registrado: 2012-04-15 01:53 @120

Re: Parseando CSV

Notapor tutoki » 2012-10-12 19:34 @857

bufff "tas pasao", no tengo palabras. Déjame digerirlo, buenas noches

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

Re: Parseando CSV

Notapor tutoki » 2012-10-14 15:55 @704

Hola

Tenía una ristra de preguntas pero analizándolas veo que el problema que tengo es que me pierdo con la referencias (sobretodo), los hashes de arrays o los arrays de arrays, etcétera.

Líneas como:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @fechas = sort
  2.                   keys %{ $log{$maquina}->{ ${ $medidas{$medida}->{datos} }[0] } };
  3. #
  4. for my $item ( @{ $medidas{$medida}->{datos} } )
  5. #
  6. open my $SALIDA, '>', "${maquina}_$medida.xml";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


A mi no se me ocurrirían ni amenazándome de muerte y por muchos tutoriales que lea tampoco te creas que me acaba de quedar claro.

Bien, voy a trabajar con las dos pedazo de soluciones que me has dado para generar menos ficheros (por ejemplo 3, uno por máquina) a ver qué tal se me da.

cualquier pista sera bienvenida,

Muchas Gracias y hasta la próxima

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

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron