Cómo pasar datos JSON a CSV usando PHP

La pregunta que dió origen a este post era un poco más amplia:

Pero como ya hablé de cómo consumir webservices (Sean REST o SOAP) me voy a concentrar en la parte que me llamó la atención: cómo pasar de JSON a CSV.

Aclaremos los tantos antes de ir a los detalles:

Qué es JSON

JSON significa JavaScript Object Notation, es decir: notación de objetos de JavaScript. Está más allá del alcance de este artículo (y de este blog en general) hablar de las bondades (o falta de ellas) de JavaScript… hay mucho material muy bueno al respecto.

El punto es que, más allá de lo que a vos te guste o no, JavaScript tiene una sintaxis muy práctica para describir los objetos: todo lo que esté encerrado entre {} es un objeto (Con la excepción tal vez del cuerpo de las funciones…).

Esto lo hace un formato sumamente conveniente para el intercambio de información de estructuras complejas, ya que constituye un modo muy simple de pasar de un objeto en memoria a una representación textual (que puede ser enviada a través de un protocolo de intercambio de textos… por ejemplo HTTP :)).

En definitiva un texto que se vea así:

{
   "nombre": "Mauro",
   "amigos": [
      {
         "nombre": "Luis"
      },
      {
         "nombre": "Juan"
      }
   ],
}

Estaría representando un objeto con dos propiedades: nombre y amigos. La primera es una cadena, la segunda es un arreglo de otros objetos.

Más información acá.

Se ve muy simple (¡y lo es!) pero tiene un pequeño inconveniente: su sintaxis es muy poco permisiva (Dejá una , suelta y agarrate :p), por lo tanto, es muy conveniente usar las funciones propias de PHP para manipularlo (json_encode y json_decode).

Y acá me da un poco de nostalgia hablar del primer post que escribí para este blog, pero pienso que puede aportar a la respuesta saber cómo iterar sobre un JSON usando PHP.

Qué es CSV

CSV significa Comma Separated Values (Valores separados por comas). Se trata de un formato de texto que también es utilizado para el intercambio de información entre sistemas.

Usualmente el contenido de este tipo de archivos es una sucesión de filas que corresponden con registros cuya cantidad de campos puede variar de uno a otro y la longitud de cada campo también varía.

Ejemplo:

Nombre,Apellido,Mail,Edad,Ciudad
Mauro,Chojrin,mauro.chojrin@leewayweb.com,40,Buenos Aires,
Steve,Jobs,sjobs@apple.com,,,
Alfredo,,alopez@gmail.com,,,
,Gutierrez,dgutierrez@hotmail.com,46,,

De JSON a CSV

Una primera salvedad que hay que hacer es que JSON es un formato que permite estructuras complejas (de múltiples niveles por ejemplo), mientras que CSV es un formato mucho más simple (Se basa en estructuras «planas»), con lo cual, algo se perderá en el camino (o habrá que hacer alguna suposición o transformación de la información).

A efectos prácticos, asumamos que el JSON de partida es de un único nivel, algo como:

[
 {
  "nombre": "Mauro",
  "apellido": "Chojrin",
  "correo": "mauro.chojrin@leewayweb.com"
 },
 {
  "nombre": "Pedro",
  "apellido": "Alvarez",
  "correo": "palvarez@gmail.com"
 },
 {
  "nombre": "Laura",
  "apellido": "Perez",
  "correo": "lau.perez@hotmail.com"
 }
]

El CSV correspondiente sería:

nombre,apellido,correo,
Mauro,Chojrin,mauro.chojrin@leewayweb.com,
Pedro,Alvarez,palvarez@gmail.com,
Laura,Perez,lau.perez@hotmail.com",

Un código PHP que logra eso es:

<?php

$f = fopen( 'salida.csv', 'w+' );
$array = json_decode( file_get_contents( 'entrada.json' ), true );

array_unshift( $array, [ 'nombre', 'apellido', 'correo' ] );
foreach ( $array as $object ) {
fputcsv( $f, $object );
}

fclose( $f );

Ahora, si la necesidad es más compleja… nada mejor que buscar un poco :).

Buscando buscando encontré esta herramienta: https://github.com/danmandle/JSON2CSV (No la probé pero parece interesante… ¿te animás a probarla y comentar?)

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.