JavaScript - Exportar un JSON Array a CSV

   
Vista:
Imágen de perfil de Juanjo

Exportar un JSON Array a CSV

Publicado por Juanjo (27 intervenciones) el 11/12/2015 16:09:06
Hola amigos, tras vuestra ayuda en otro post, he conseguido poder leer un json de mi proveedor, ahora lo que no consigo es crear un csv (xml tambien me serviría) con los datos obtenidos

He leído mucho y he probado varias opciones, y si, consigo que me cree el fichero csv pero con solo con dos lineas

0,
Array

El json que obtengo de mi proveedor es el siguiente:
1
2
3
4
{"errors":{"code":0,"text":""},"results":{"resultado":[{"referencia":"00000","cantidad":"24","cantidad_proveedor":null,"delivery_time":""},{"referencia":"00001","cantidad":"48","cantidad_proveedor":"96","delivery_time":"Entrega en 2-4 d\u00edas"},{"referencia":"00059_1","cantidad":"12","cantidad_proveedor":"36","delivery_time":""},{"referencia":"00061_1","cantidad":"0","cantidad_proveedor":"0","delivery_time":""},
.....
{"referencia":"00236_2","cantidad":"0","cantidad_proveedor":"0","delivery_time":"2-40 d\u00edas: Fabricaci\u00f3n"},{"referencia":"00236_3","cantidad":"0","cantidad_proveedor":"0","delivery_time":""},{"referencia":"00236_4","cantidad":"0","cantidad_proveedor":"0","delivery_time":""},
,{"referencia":"9775Z","cantidad":"0","cantidad_proveedor":"0","delivery_time":"2-40 d\u00edas: Fabricaci\u00f3n"}]}}

El codigo que he realizado y que me da el 0 array es el siguiente:

1
2
3
4
5
6
7
8
9
$json_file2 = file_get_contents('http://proveedor.com/actions/servicioWS.php?method=getStockAllProducts', false, $context2);
 
$json_obj = json_decode($json_file2, true);
 
$fp = fopen('stock2.csv', 'w');
    foreach ($json_obj as $row) {
        fputcsv($fp, $row);
    }
fclose($fp);

Pero no me exporta lo que yo deseo, que sería así:
referencia,cantidad,cantidad_proveedor,deliverty_time
00000,24,null,
00001,48,96,Entrega en 2-4 d\u00edas //si fuera en UTF-8 ya sería la perfecto (2-4 días)
00059_1,12,36,

Como ya os comente, soy muy nuevo en JSON, pero estoy aprendiendo mucho con vosotros
Gracias de antemano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Jordi

Exportar un JSON Array a CSV

Publicado por Jordi (75 intervenciones) el 11/12/2015 20:01:05
Buenas Juanjo,

La saga continúa! Lo que te está pasando ahora es que estás intentando convertir en CSV todo el objeto $json_obj. Supongo que el 0 es el "errors" y "Array" es el array de los datos, en vez de coger solamente el array.

Los datos que a ti te interesan son los de $json_obj.results.resultado, que se trata de un array con N jsones sobre los cuales tienes que iterar en el for que estás utilizando ahora.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Juanjo

Exportar un JSON Array a CSV

Publicado por Juanjo (27 intervenciones) el 11/12/2015 21:43:29
A mas vueltas le doy mas perdido ando, he mirado unas 200 paginas de ejemplos de fputcsv, pero en ninguna veo un array similar al mio para poder tener una idea.... ufffff

Perdido total :(
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jordi

Exportar un JSON Array a CSV

Publicado por Jordi (75 intervenciones) el 11/12/2015 23:00:07
Prueba con esto.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$json_file2 = file_get_contents('http://proveedor.com/actions/servicioWS.php?method=getStockAllProducts', false, $context2);
 
// De json a array
$json_obj = json_decode($json_file2, true);
 
// Coges lo que te interesa. Es decir, el array de results.resultado
$results = $json_obj['results']['resultado'];
 
$fp = fopen('stock2.csv', 'w');
fprintf($df, chr(0xEF).chr(0xBB).chr(0xBF)); // Headers para UTF-8
    foreach ($results as $row) {
        // Guardas los csv
        // Prueba a coger los valores como $row['referencia'], $row['cantidad']...
        fputcsv($fp, $row);
    }
fclose($fp);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Juanjo

Exportar un JSON Array a CSV

Publicado por Juanjo (27 intervenciones) el 12/12/2015 00:57:28
Me pusiste algunas trampas pero las descubri, pero me sigue dando el error en el mismo sitio que siempre

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$json_file2 = file_get_contents('http://proveedor.com/actions/servicioWS.php?method=getStockAllProducts', false, $context2);
 
// De json a array
$json_obj = json_decode($json_file2, true);
 
// Coges lo que te interesa. Es decir, el array de results.resultado
$results = $json_obj['results'].['resultado'];     //faltaba el punto de concatenado
 
$fp = fopen('stock2.csv', 'w');
fprintf($fp, chr(0xEF).chr(0xBB).chr(0xBF)); // Headers para UTF-8 (pusiste $df)
    foreach ($results as $row) {            // aqui es donde siempre me da el error en todas mis pruebas y también en la tuya, mismo error: Warning: Invalid argument supplied for foreach() in .../4.php on line 97
        // Guardas los csv
        // Prueba a coger los valores como $row['referencia'], $row['cantidad']...
        fputcsv($fp, $row);
    }
fclose($fp);

por eso se me complicaba, no se dimensionar correctamente
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jordi

Exportar un JSON Array a CSV

Publicado por Jordi (75 intervenciones) el 12/12/2015 08:54:25
Ups, no me di cuenta, recopilé información de aquí y allá.

El primer paso es lograr imprimir el array de los resultados antes de pasar a csv para saber que se está haciendo bien y eso no falla.

¿Puedes imprimir $results y ver qué nos muestra? Tiene que devolver el array que nos interesa. De momento olvídate del csv.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Juanjo

Exportar un JSON Array a CSV

Publicado por Juanjo (27 intervenciones) el 12/12/2015 09:26:31
Esto es lo que contiene
1
2
3
4
5
print 'RESULTS : '.$results.'<br />';
print 'JSON_OBJ : '.$json_obj.'<br />';
 
RESULTS : ArrayArray
JSON_OBJ : Array
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Juanjo

Exportar un JSON Array a CSV

Publicado por Juanjo (27 intervenciones) el 12/12/2015 10:16:44
Asi es el array
1
2
3
4
5
6
7
8
{
"errors":
	{"code":0,"text":""},
"results":
	{"resultado":
		[{"referencia":"00000","cantidad":"0","cantidad_proveedor":null,"delivery_time":""}]
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jordi

Exportar un JSON Array a CSV

Publicado por Jordi (75 intervenciones) el 12/12/2015 12:25:26
Échale un ojo a este link: http://stackoverflow.com/questions/10914687/retrieving-array-keys-from-json-input

A lo mejor te sirve de la siguiente forma:

1
2
3
4
5
foreach ($json_obj->results as $row) {
         foreach($row->resultado as $key => $val) {
                 // Aquí tienes cada $key y $value de cada JSON para iterar
        }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Juanjo

Exportar un JSON Array a CSV

Publicado por Juanjo (27 intervenciones) el 12/12/2015 16:29:58
He probado 200.000 combinaciones, de los vlaores row y json_obj y nada, seguimos con el mismo error en el segundo for

1
2
3
4
Warning: Invalid argument supplied for foreach() in 106, que es el segundo for
foreach($row->resultado as $key => $val) {
echo $key . ': ' . $val;
        }

Inclusive dejandolo en blanco para que no hiciera nada, solo ver si estaba ahi el error, sigo igual

PD. Antes de contestar siempre hago todas las pruebas posibles dentro de mis conocimientos, ($row->resultado[0] .... $json_obj->results[0], ..... siempre el mismo error, creo que el problema esta mas arriba, en el $json_obj, pero todos los ejemplos que veo, no tienen arrays anidados como el mio, inclusive en el link q me pasaste, es un unico array, me explico:

Ejemplos tipicos, como el del link que pusiste
1
2
3
4
5
{"entries":[
{"id": "29","name":"John", "age":"36"},
{"id": "30","name":"Jack", "age":"23"}
]}
');

Pero ninguno similar al mio
1
2
3
4
5
6
7
8
{
"errors":
	{"code":0,"text":""},
"results":
	{"resultado":
		[{"referencia":"00000","cantidad":"0","cantidad_proveedor":null,"delivery_time":""}]
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Juanjo

Exportar un JSON Array a CSV

Publicado por Juanjo (27 intervenciones) el 13/12/2015 18:36:42
Sigo intentando y donde veo que estamos fallando es en el json_decode

Puesto que al entrar el json va completo pero al salir, solo consigo ver "Array"

Asi que vamos por partes (como dijo jack el destripador)

Tenemos este código
1
2
3
4
5
6
7
$json_file2 = file_get_contents('http://proveedor.com/actions/servicioWS.php?method=getStockAllProducts', false, $context2);
 
// De json a array
$json_obj = json_decode($json_file2, true);
 
// Coges lo que te interesa. Es decir, el array de results.resultado
$results = $json_obj['results']['resultado'];

donde $json_file2 muestra perfectamente todo el array tal y como lo mostré arriba

1
2
3
4
{"errors":{"code":0,"text":""},"results":{"resultado":[{"referencia":"00000","cantidad":"24","cantidad_proveedor":null,"delivery_time":""},{"referencia":"00001","cantidad":"48","cantidad_proveedor":"96","delivery_time":"Entrega en 2-4 d\u00edas"},{"referencia":"00059_1","cantidad":"12","cantidad_proveedor":"36","delivery_time":""},
.....
{"referencia":"00236_4","cantidad":"0","cantidad_proveedor":"0","delivery_time":""},
,{"referencia":"9775Z","cantidad":"0","cantidad_proveedor":"0","delivery_time":"2-40 d\u00edas: Fabricaci\u00f3n"}]}}

Pero al pasarlo a Array con $json_obj = json_decode($json_file2, true);

El resultado de $json_obj es (Array)

Por lo que pienso que primero hay que conseguir que $json_obj me muestre los datos que yo deseo del array (si es que los lleva dentro)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jordi

Exportar un JSON Array a CSV

Publicado por Jordi (75 intervenciones) el 14/12/2015 22:00:44
Los datos que tú quieres del json $json_obj son los del array de jsones comprendido en $json_file2->results->resultado. ¿Qué obtienes al hacer lo siguiente?

1
2
3
4
5
$json_obj = json_decode($json_file2->results->resultado); // Decodificamos solo lo que nos interesa
$fp = fopen('stock2.csv', 'w');
foreach($json_obj as $pos) {    // Por cada array...
        fputcsv($fp,$pos);
}

Este link es parecido a tu caso: http://stackoverflow.com/questions/3555335/php-decode-nested-json

Si sigue sin funcionar, prueba a hacer otro decode de $pos dentro del foreach, o crear un nuevo array ahí con los atributos de $pos, accesibles como $pos->referencia, $pos->cantidad...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Juanjo

Exportar un JSON Array a CSV

Publicado por Juanjo (27 intervenciones) el 15/12/2015 10:08:52
Buenos dias

He puesto un print para ver que tenia $json_obj pero sale en blanco

Sin añadir nada mas

1
2
3
4
5
6
7
8
9
10
11
12
$json_obj = json_decode($json_file2->results->resultado); // Decodificamos solo lo que nos interesa
print 'JSON_obj : '.$json_obj.'<br />';
$fp = fopen('stock2.csv', 'w');
foreach($json_obj as $pos) {    // Por cada array...
        fputcsv($fp,$pos);
}
 
Resultado
 
JSON_obj :
 
Warning: Invalid argument supplied for foreach() in /home/u648256038/public_html/4e.php on line 103

1
2
3
4
5
6
7
8
$json_obj = json_decode($json_file2->results->resultado); // Decodificamos solo lo que nos interesa
print 'JSON_obj : '.$json_obj.'<br />';
$fp = fopen('stock2.csv', 'w');
foreach($json_obj as json_decode($pos)= {    // Por cada array...
        fputcsv($fp,$pos);
}
 
Fatal error: Can't use function return value in write context in /home/u648256038/public_html/4e.php on line 103

Luego seguire probando mas cosas, tengo que salir, Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Juanjo

Exportar un JSON Array a CSV

Publicado por Juanjo (27 intervenciones) el 15/12/2015 23:35:40
Interesante avance

1
2
3
4
5
6
7
8
$decoded = json_decode($json_file2, true);     // he añadido el true, si no lo pongo da error
 
$comments = $decoded->data->results->referencia;    // esta linea no la estoy utilizando
 
$fp = fopen('notocar.csv', 'w');
		foreach($decoded['results'] as $comment){
		   fputcsv($fp, $comment);
		}

Genera un csv con una linea asi

1
Array,Array,Array,Array,Array,Array,Array,Array,Array,Array,Array,Array,Array......................
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar