API web abriendo un archivo zip?Hola a todos,
Estoy trabajando con un cliente que obtiene datos de una API web que envía los datos al usuario en formato zip. Me las arreglé para averiguar cómo cambiar el valor predeterminado de XML en el archivo a CSV, pero todavía me encuentro con el desafío de obtener los datos en JMP en lugar de la carpeta de descargas.
Los datos provienen de:
El comando web obtendrá los datos descargados muy bien. Pero solo sería verdaderamente útil para el cliente si los datos pasan de la API web a JMP. @Craige_Hales Tuve algunas publicaciones excelentes para señalarme más adelante en Run Program () y cURL path:
Sin embargo todavía estoy atascado. Tal vez necesito aprender más sobre la instrucción de lectura Ejecutar programa, o entender más las opciones de cURL.
/* generating a start time string for query injection */
starttime = "20160418T07:00-0000";
startdatetime = "&startdatetime=" || starttime;
If( starttime == "",startdatetime = "");
/* generating a end time string for query injection */
endtime = "";
enddatetime = "&enddatetime=" || endtime;
If( endtime == "",enddatetime = "");
/* FILENAME */
FILENAME = "CURR_LMP_GRP";
// CAISO (california energy pricing API)
oasis = "http://oasis.caiso.com/oasisapi/";
query = "GroupZip?groupid="|| FILENAME || startdatetime || "&version=1&resultformat=6";
url = oasis || query;
// download the data
web(url);
// the goal is to directly pull the item into JMP
/* RunProgram to pull the table into JMP (taken from a Craig Hales Post) */
If( HostIs("Windows"),
data = RunProgram(
executable( Convert File Path( "$desktop", windows ) || "curl.exe" ),
options( "-k -s --basic " || url ),
readfunction( "blob" )
);
, // else mac version
data = RunProgram(
executable( "/usr/bin/curl" ),
options( {"-k", "-s", "--basic", url} )
, readfunction( "blob" )
);
);
try( dt = open(data, "text"); error="", error=exception_msg; dt=empty() );
show(dt,error);
También existe alguna posibilidad de extensibilidad de este problema para nosotros. Piense en el poder de demostración de poder raspar la API de Amazon para las revisiones de los clientes. Ejecutar programa () y un script python podría hacer el truco
--Nate
Re: Web API abriendo un archivo zip?De hecho, evitar mi escritura en el disco antes de tener un archivo JMP fue mi intención. Gracias por la perspicacia!
Re: Web API abriendo un archivo zip?El primer argumento que se abre es normalmente una cadena ... el * nombre * de un archivo. Cuando es un blob, abrir lo trata como si fuera el * contenido * de un archivo, pero no hay una extensión (.jmp, etc.), por lo que se necesita el segundo argumento para abrir ("datos", "secuencia de comandos", etc. ). (Internamente, abierto puede escribir el blob en una ubicación temporal, dependiendo de qué subsistema hará abierto). El script de origen Abrir ("/ 000000002A75C3D0 /" ... me dice que NO fue escrito en el disco, que es lo que está esperando.)Re: Web API abriendo un archivo zip?Gracias de nuevo Craige!
A continuación se muestra un ejemplo completo de JSL con los elementos sugeridos implementados.
/* generating a start time string for query injection */
starttime = "20160418T07:00-0000";
startdatetime = "&startdatetime=" || starttime;
If( starttime == "",startdatetime = "");
/* generating a end time string for query injection */
endtime = "";
enddatetime = "&enddatetime=" || endtime;
If( endtime == "",enddatetime = "");
/* FILENAME */
FILENAME = "CURR_LMP_GRP";
// CAISO (california energy pricing API)
oasis = "http://oasis.caiso.com/oasisapi/";
query = "GroupZip?groupid="|| FILENAME || startdatetime || "&version=1&resultformat=6";
url = oasis || query;
//open the zip download which may have multiple files
za = open( url, "zip"); // 2nd zip important!
zaList = za << dir; //get a list of the files in the archive
for( i = n items(zaList), i > 0, i--,
blob = za<<READ></READ>
Fascinante que la especificación del formato (blob) permite que el comando abierto funcione, pero un formato (texto) no lo hará.
Re: Web API abriendo un archivo zip?try(deletefile("$temp/deleteme.zip"));
za = open("$temp/deleteme.zip","zip");
member = za<<WRITE></WRITE>
Abrir con una gota. use charToBlob () si no tiene un blob.
Re: Web API abriendo un archivo zip?Lo siguiente creará un archivo de texto para abrir, pero no puedo evitar sentir que debería haber una mejor manera.
Save Text File("$TEMP/" || FILENAME || Char(i) || ".txt",txt);
open("$TEMP/" || FILENAME || Char(i) || ".txt");
--Nate
Re: Web API abriendo un archivo zip?Gracias Craig!
Eso me consiguió casi todo el camino. Pude haber jurado que probé zip como un argumento en la declaración abierta sin suerte (es probable que el caso o la cadena no coincidan), pero con su código de ejemplo, ¡he podido hacer que los datos realmente se lean!
//open the zip download
za = open( url, "zip"); // 2nd zip important!
zaList = za << dir; //get a list of the files in the archive
for( i = n items(zaList), i > 0, i--,
txt = za<<READ></READ>
Mi siguiente paso es convertir txt en una tabla.
Re: Web API abriendo un archivo zip?prueba algo como esto:
za = abierto (" http://someurl.that.downloads.a.zip "," zip "); // 2nd zip important!
show (za << miembros);
txt = za << leer ("miembro1"); // nombre de la lista de arriba
za es el objeto ZipArchive en el índice de scripting. la url puede no terminar en .zip pero debe descargar un archivo zip.