API Web che apre un file zip?Ciao a tutti,
Sto lavorando con un cliente che riceve i dati da un'API Web che avviene per inviare i dati all'utente in formato zip. Sono riuscito a capire come modificare l'impostazione predefinita da XML nell'archivio a CSV, ma sto ancora affrontando la sfida di ottenere i dati estratti in JMP anziché nella cartella dei download.
I dati provengono da:
Il comando web otterrà i dati scaricati piacevolmente. Ma sarebbe davvero utile per il cliente se i dati passassero da Web API in JMP. @Craige_Hales ha avuto alcuni post fantastici per indicarmi più avanti il percorso Run () e il percorso cURL:
Tuttavia mi sto ancora bloccando. Forse ho bisogno di saperne di più sull'istruzione di lettura del programma di esecuzione, o di capire meglio le opzioni di 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);
Esiste anche una certa estensibilità di questo problema per noi. Pensa al potere dimostrativo di poter analizzare l'API del web di Amazon per le recensioni dei clienti. Esegui programma () e a script python potrebbe fare il trucco
--Nate
Re: API Web che apre un file zip?In effetti, evitare di scrivere su disco prima di avere un file JMP era davvero il mio intento. Grazie per l'intuizione!
Re: API Web che apre un file zip?Il primo argomento da aprire è normalmente una stringa ... il * nome * di un file. Quando è un blob, open lo tratta come se fosse il * contenuto * di un file, ma non c'è estensione (.jmp, ecc.) Quindi è necessario il secondo arg per aprire ("data", "script", ecc. ). (Internamente, open può scrivere il blob in una posizione temporanea, a seconda di quale sottosistema farà l'open. Lo script di origine Apri ("/ 000000002A75C3D0 /" ... mi dice che NON è stato scritto su disco, che è quello che stai sperando.)Re: API Web che apre un file zip?Grazie ancora Craige!
Di seguito è riportato un esempio JSL completo con gli elementi suggeriti implementati.
/* 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>
Affascinante che specificando il formato (blob) consente al comando open di funzionare ma un formato (testo) no.
Re: API Web che apre un file zip?try(deletefile("$temp/deleteme.zip"));
za = open("$temp/deleteme.zip","zip");
member = za<<WRITE></WRITE>
Apri con un blob. usa charToBlob () se non hai un blob.
Re: API Web che apre un file zip?Quanto segue creerà un file di testo per l'apertura, ma non posso fare a meno di pensare che ci dovrebbe essere un modo migliore.
Save Text File("$TEMP/" || FILENAME || Char(i) || ".txt",txt);
open("$TEMP/" || FILENAME || Char(i) || ".txt");
--Nate
Re: API Web che apre un file zip?Grazie Craig!
Questo mi ha fatto quasi tutto lì. Avrei potuto giurare di aver provato zip come argomento nell'istruzione aperta senza fortuna (le probabilità sono case improprie o stringa contro non), ma con il tuo codice di esempio sono riuscito a leggere i dati effettivamente!
//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>
Il mio prossimo passo è convertire il txt in un tavolo.
Re: API Web che apre un file zip?prova qualcosa del genere:
za = open (" http://someurl.that.downloads.a.zip "," zip "); // 2 ° zip importante!
mostra (ZA << membri);
txt = za << read ("member1"); // nome dalla lista sopra
za è l'oggetto ZipArchive nell'indice di scripting. l'url potrebbe non finire in .zip ma deve scaricare un file zip.