• Publicidad

Formateo JSON

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

Formateo JSON

Notapor tutoki » 2012-11-24 08:48 @408

Hola.

Tengo un fichero csv que tengo que analizar a formato JSON.

El csv:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Equipo,VM,SSOO,Modelo,N/Serie,"Apli 1","Apli 2","Apli 3",Cluster,Entorno
CDV01,SI,"W2003 EE x64 R2",VM,N/A,"DC W2003",,,NO,PRO
CDV02,SI,"W2003 EE x64 R2",VM,N/A,"DC W2003",,,NO,PRO
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Esto es lo que quisiera que saliera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
{
  "aaData": [
        {
                "Equipo": "CDV01",
                "Virtual": "SI",
                "SSOO": "W2003 EE x64 R2",
                "Modelo": "VM",
                "N/Serie": "",
                "Apli 1": "DC W2003",
                "Apli 2": "",
                "Apli 3": "",
                "Cluster": "NO",
                "Entorno": "PRO"
        },
        {
                "Equipo": "CDV02",
                "Virtual": "SI",
                "SSOO": "W2003 EE x64 R2",
                "Modelo": "VM",
                "N/Serie": "",
                "Apli 1": "DC W2003",
                "Apli 2": "",
                "Apli 3": "",
                "Cluster": "NO",
                "Entorno": "PRO"
        }
]
}
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Y este es el programa:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;
  4.  
  5. use JSON;
  6. use Text::CSV::Slurp;
  7. #use JSON::PP;
  8.  
  9. ####################################################################################
  10. ## Argumentos
  11. ####################################################################################
  12. @ARGV == 1 or die "Uso: $0 <archivo CSV a procesar>\n";
  13.  
  14. my $archivo_csv = shift;
  15.  
  16. ####################################################################################
  17. ## Lectura del archivo
  18. ####################################################################################
  19. my $datos = Text::CSV::Slurp->load(
  20.         file       => $archivo_csv,
  21.         sep_char   => ',',
  22.         quote_char => '"'
  23. );
  24.  
  25. ####################################################################################
  26. ## Genero el archivo JSON
  27. ####################################################################################
  28. open my $SALIDA, '>', "ejemplo.json";
  29.                 say $SALIDA qq({
  30.   "aaData":);
  31.                 say $SALIDA encode_json $datos;
  32.                 say $SALIDA qq(});
  33.                 close $SALIDA;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


El asunto:

1- el json se forma todo en una misma línea lo que dificulta su lectura
2- no sé por qué me desordena el orden que hay en el csv
3- me gustaría utilizar métodos, tipo pretty pero no tengo claro cómo hacerlo


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

Publicidad

Re: Formateo JSON

Notapor explorer » 2012-11-24 10:58 @498

tutoki escribiste:1- el json se forma todo en una misma línea lo que dificulta su lectura
¿Qué dices? ¿¿¿Lo va a leer un ser humano???


tutoki escribiste:2- no sé por qué me desordena el orden que hay en el csv
El módulo Text::CSV::Slurp crea un array de hashes, y por la propia naturaleza de los hash, desordena el orden de los campos. Pero... en un formato JSON, al igual que en un XML, eso no importa.


tutoki escribiste:3- me gustaría utilizar métodos, tipo pretty pero no tengo claro cómo hacerlo
En el manual hace referencia a llamar a pretty como un método, en efecto, pero tu no has creado ningún objeto JSON, así que debes crearlo antes.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $json = JSON->new();
  2. $json->pretty(1);
  3. say $SALIDA $json->utf8->encode($datos);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Hummm... es posible que se pueda abreviar algo...
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: Formateo JSON

Notapor tutoki » 2012-11-24 14:06 @629

Hola.

Bueno a cada cual le da por una cosa, a mi a lo mejor me da por leer ficheros JSON. :) (lo que me faltaba)

Cuando monto un prototipo es preferible trabajar con datos lo más claros posible.

Volviendo al tajo, me ha sorprendido, "por la naturaleza de los hashes"

¿lee los datos en bloques?

Los datos (csv) ya vienen ordenados ¿cómo puedo dejarlos como en el origen? ¿lo tengo que indicar explícitamente?

Creo que ya he entendido cómo se declaran los métodos, muchas gracias
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. say $SALIDA $json->utf8->pretty(1)->encode($datos);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
tutoki
Perlero nuevo
Perlero nuevo
 
Mensajes: 58
Registrado: 2012-04-15 01:53 @120

Re: Formateo JSON

Notapor explorer » 2012-11-24 14:52 @661

Text::CSV::Slurp lee los registros por líneas y las va guardando por elementos del array, y dentro del array se guarda un hash con las columnas, y es ahí donde se pierde el orden (por defecto, en los hash no se guardan los pares clave-valor en el mismo orden en que fueron creados).

Quizás es el JSON el que los desordena... Mira a ver si hay alguna opción en el módulo relativa a eso.
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: Formateo JSON

Notapor tutoki » 2012-11-24 18:30 @813

He colocado un Dumper después de la carga del archivo CSV y ahí ya está mal.

He probado a modificar el CSV original, quitarle las comillas, los espacios y curiosamente sigue saliendo desordenado, pero diferente a cuando realizo pruebas con el CSV original. ¿?

A mi me resulta curioso ( al menos).

He estado viendo las opciones tanto de Text::CSV como JSON y no he encontrado nada a priori que me dé alguna luz.

Ando un poco perdido


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

Re: Formateo JSON

Notapor explorer » 2012-11-24 20:21 @890

He hecho una prueba, y me sale bien:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use Text::CSV::Slurp;
  4.  
  5. my $csv = q(Equipo,VM,SSOO,Modelo,N/Serie,"Apli 1","Apli 2","Apli 3",Cluster,Entorno
  6. CDV01,SI,"W2003 EE x64 R2",VM,N/A,"DC W2003",,,NO,PRO
  7. CDV02,SI,"W2004 EE x64 R3",VM,N/A,"DC W2004",,,NO,PRO
  8. CDV03,SI,"W2005 EE x64 R4",VM,N/A,"DC W2005",,,NO,PRO
  9. CDV04,SI,"W2006 EE x64 R5",VM,N/A,"DC W2006",,,NO,PRO
  10. );
  11.  
  12. my $datos = Text::CSV::Slurp->load(string => $csv);
  13.  
  14. use Data::Dumper;
  15. say Dumper $datos;
  16.  
  17. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$VAR1 = [
          {
            'Apli 2' => '',
            'Apli 1' => 'DC W2003',
            'SSOO' => 'W2003 EE x64 R2',
            'VM' => 'SI',
            'Equipo' => 'CDV01',
            'Apli 3' => '',
            'N/Serie' => 'N/A',
            'Modelo' => 'VM',
            'Entorno' => 'PRO',
            'Cluster' => 'NO'
          },
          {
            'Apli 2' => '',
            'Apli 1' => 'DC W2004',
            'SSOO' => 'W2004 EE x64 R3',
            'VM' => 'SI',
            'Equipo' => 'CDV02',
            'Apli 3' => '',
            'N/Serie' => 'N/A',
            'Modelo' => 'VM',
            'Entorno' => 'PRO',
            'Cluster' => 'NO'
          },
          {
            'Apli 2' => '',
            'Apli 1' => 'DC W2005',
            'SSOO' => 'W2005 EE x64 R4',
            'VM' => 'SI',
            'Equipo' => 'CDV03',
            'Apli 3' => '',
            'N/Serie' => 'N/A',
            'Modelo' => 'VM',
            'Entorno' => 'PRO',
            'Cluster' => 'NO'
          },
          {
            'Apli 2' => '',
            'Apli 1' => 'DC W2006',
            'SSOO' => 'W2006 EE x64 R5',
            'VM' => 'SI',
            'Equipo' => 'CDV04',
            'Apli 3' => '',
            'N/Serie' => 'N/A',
            'Modelo' => 'VM',
            'Entorno' => 'PRO',
            'Cluster' => 'NO'
          }
        ];
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Si te fijas en los campos 'Equipo', ves que siguen el mismo orden que en el archivo CSV.
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: Formateo JSON

Notapor tutoki » 2012-11-25 03:23 @182

Mas razón que un Santo, como dicen por ahí. Gracias de nuevo.
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 22 invitados