• Publicidad

Construir un array interpretando datos CSV

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

Construir un array interpretando datos CSV

Notapor tutoki » 2012-09-25 17:27 @769

Hola

Tengo unos datos que analizar, en server-cpu-avg.csv (hay un ejemplo anexado), que luego formarán un fichero XML.

Creo que me he liado al construir el array y, aunque funciona, no sé quitar la primera línea (que serían los nombres de las columnas, que no me interesan para nada) y tampoco sé quitar las comillas. Sería algo así: s/"//g, pero no tengo claro dónde ponerlo en el código (todo esto lo quisiera hacer durante el proceso de construcción).

Gracias de antemano.

Este es el programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #use strict;
  3. #use warnings;
  4. my $csv_a_procesar = shift    # es igual a  shift @ARGV
  5.   || die "Uso: $0 <nombre de fichero>n";
  6. open( my $fh, "<", $csv_a_procesar )
  7.   || die "No puedo abrir el fichero. Error $!\n";
  8. my @datos;                    
  9. my @fechas;
  10.  
  11. while (<$fh>)
  12. {
  13.         chomp;                                                       # muerdo el retorno de carro final
  14.  
  15.         @datos = split( ";", $_ );               # separo los campos
  16.         push( @fechas, $datos[1] );                      # hago un array ordenado de las fechas , que son los indices del hash
  17.         $datos1{ $datos[1] } = $datos[0];
  18.         $datos2{ $datos[1] } = $datos[2];
  19.         $datos3{ $datos[1] } = $datos[3];
  20.         $datos4{ $datos[1] } = $datos[4];
  21.         $datos5{ $datos[1] } = $datos[5];
  22.         $datos6{ $datos[1] } = $datos[6];
  23.         $datos7{ $datos[1] } = $datos[7];
  24.         $datos8{ $datos[1] } = $datos[8];    # construyo los arrays
  25. }
  26.  
  27. # print "$datos[7]" . "\n";
  28. close $fh;
  29.  
  30. open( my $fhout, ">", "test.xml" );
  31. print $fhout
  32. ' <chart showvalue="0" caption="Prueba con poco datos" xaxisname="tiempo" yaxisname="datos" palette="1"> '
  33.   . "\n";
  34. my $date;
  35. print $fhout ' <categories>' . "\n";
  36. foreach $date (@fechas)
  37. {
  38.         print $fhout '            <category label="' . $date . '" />' . "\n";
  39. }
  40. print $fhout ' </categories>' . "\n";
  41.  
  42. print $fhout ' <dataset SeriesName="dato1">' . "\n";
  43. foreach $date (@fechas)
  44. {
  45.         print $fhout '            <set value="' . $datos1{$date} . '" />' . "\n";
  46. }
  47. print $fhout ' </dataset>' . "\n";
  48. close $fhout;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Este es el archivo a interpretar:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. "Value";"Timestamp";"MetricId";"Unit";"Description";"Entity";"EntityId";"IntervalSecs";"Instance"
  2. "36,63";"25/09/2012 12:00:00";"cpu.usage.average";"%";"CPU usage as a percentage during the interval";"repjfesx01.repsol.vmware.es";"HostSystem-host-836";"1800";""
  3. "43,47";"25/09/2012 11:30:00";"cpu.usage.average";"%";"CPU usage as a percentage during the interval";"repjfesx01.repsol.vmware.es";"HostSystem-host-836";"1800";""
  4. "39,96";"25/09/2012 11:00:00";"cpu.usage.average";"%";"CPU usage as a percentage during the interval";"repjfesx01.repsol.vmware.es";"HostSystem-host-836";"1800";""
  5. "39,66";"25/09/2012 10:30:00";"cpu.usage.average";"%";"CPU usage as a percentage during the interval";"repjfesx01.repsol.vmware.es";"HostSystem-host-836";"1800";""
  6. "38,54";"25/09/2012 10:00:00";"cpu.usage.average";"%";"CPU usage as a percentage during the interval";"repjfesx01.repsol.vmware.es";"HostSystem-host-836";"1800";""
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

Publicidad

Re: Construir un array interpretando datos CSV

Notapor explorer » 2012-09-25 21:34 @940

Para saltar la primera línea, basta con leerla y no hacer nada con ella:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. <$fh>;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y para quitar las comillas, pues puedes hacerlo después del chomp():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         s/"//g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


De todas maneras... te sobran muchas líneas, ¿no?

Aquí hay otra versión, más reducida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;
  4.  
  5. my @datos;                    
  6. my %datos;
  7. my @fechas;
  8.  
  9. my $csv_a_procesar = shift                      # es igual a  shift @ARGV
  10.     or die "Uso: $0 <nombre de fichero>\n";
  11.  
  12. open my $fh, "<", $csv_a_procesar;
  13.  
  14. ## Lectura
  15. <$fh>;                                          # cabecera
  16. while (<$fh>) {
  17.     chomp;                                      # muerdo el retorno de carro final
  18.     s/"//g;
  19.     @datos = split /;/;                         # separo los campos
  20.     push @fechas, $datos[1];                    # array ordenado de las fechas
  21.     $datos{ $datos[1] } = $datos[0];
  22. }
  23.  
  24. close $fh;
  25.  
  26. ## Salida
  27. open my $fhout, ">", "test.xml";
  28.  
  29. say $fhout
  30.     ' <chart showvalue="0" caption="Prueba con poco datos" xaxisname="tiempo" yaxisname="datos" palette="1">';
  31.  
  32. say $fhout ' <categories>';
  33.  
  34. for my $date (@fechas) {
  35.     say $fhout qq(            <category label="$date" />);
  36. }
  37.  
  38. say $fhout ' </categories>';
  39.  
  40. say $fhout ' <dataset SeriesName="dato1">';
  41.  
  42. for my $date (@fechas) {
  43.     say $fhout qq(            <set value="$datos{$date}" />);
  44. }
  45.  
  46. say $fhout ' </dataset>';
  47.  
  48. close $fhout;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Pero, yo prefiero esta otra versión:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env 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 @set;
  17.  
  18. for my $data (@$data) {                                 # $data es una ref. a un array de hashes
  19.     push @category, { label => $data->{'Timestamp'} };  # extraemos información,
  20.     push @set,      { value => $data->{'Value'    } };  # y la guardamos en dos arrays
  21. }
  22.  
  23. my $xml1 = {                                            # cabecera del XML
  24.         chart => {
  25.             showvalue   => 0,
  26.             caption     => 'Prueba con poco datos',
  27.             xaxisname   => 'tiempo',
  28.             yaxisname   => 'datos',
  29.             palette     => 1,
  30.         }
  31.     };
  32.  
  33. my $xml2 = { category => \@category };                  # categories
  34.  
  35. my $xml3 = {                                            # dataset
  36.     dataset => {
  37.         SeriesName => 'dato1',
  38.         set => \@set,
  39.     }
  40. };
  41.  
  42. open my $fhout, ">", "test1.xml";                       # salida
  43. print   $fhout XMLout($xml1, KeepRoot => 0, RootName => '');
  44. print   $fhout XMLout($xml2, RootName => 'categories' );
  45. print   $fhout XMLout($xml3, KeepRoot => 1 );
  46. close   $fhout;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1.   <chart caption="Prueba con poco datos" palette="1" showvalue="0" xaxisname="tiempo" yaxisname="datos" />
  2. <categories>
  3.   <category label="25/09/2012 12:00:00" />
  4.   <category label="25/09/2012 11:30:00" />
  5.   <category label="25/09/2012 11:00:00" />
  6.   <category label="25/09/2012 10:30:00" />
  7.   <category label="25/09/2012 10:00:00" />
  8. </categories>
  9. <dataset SeriesName="dato1">
  10.   <set value="36,63" />
  11.   <set value="43,47" />
  12.   <set value="39,96" />
  13.   <set value="39,66" />
  14.   <set value="38,54" />
  15. </dataset>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De todas maneras, me parece que estás generando mal el XML... ¿no debería <chart> encerrar a todo el archivo, en lugar de aparecer solo en la primera línea? (Dicho de otro modo, debería existir un </chart> al final.)
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: Construir un array interpretando datos CSV

Notapor tutoki » 2012-09-29 20:01 @875

Muchas -como siempre respondiste más de lo que pedía- gracias
tutoki
Perlero nuevo
Perlero nuevo
 
Mensajes: 58
Registrado: 2012-04-15 01:53 @120


Volver a Básico

¿Quién está conectado?

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