API Web ouvrant un fichier zip?Salut à tous,
Je travaille avec un client qui obtient des données d'une API Web qui les envoie à l'utilisateur au format zip. J'ai réussi à comprendre comment changer la valeur par défaut de XML dans l'archive en fichier CSV, mais je continue à avoir le défi d'obtenir les données extraites dans JMP au lieu du dossier de téléchargement.
Les données proviennent de:
La commande Web récupérera les données correctement. Mais cela ne serait vraiment utile au client que si les données passent de l'API Web à JMP. @Craige_Hales Il y avait quelques bons messages qui me dirigeaient plus loin dans les chemins Run Program () et cURL:
Cependant, je suis toujours bloqué. Peut-être ai-je besoin d'en savoir plus sur l'instruction de lecture du programme d'exécution ou de mieux comprendre les options 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);
Il existe également une possibilité d'extension de ce problème pour nous. Pensez au pouvoir de démonstration de pouvoir extraire l’API Web d’Amazon pour obtenir des avis de clients. Run Program () et un script python pourrait faire l'affaire.
--Nate
Re: API Web ouvrant un fichier zip?En fait, mon intention était d'éviter d'écrire sur le disque avant d'avoir un fichier JMP. Merci pour la perspicacité!
Re: API Web ouvrant un fichier zip?Le premier argument à ouvrir est normalement une chaîne ... le * nom * d'un fichier. Quand il s'agit d'un blob, open le traite comme s'il s'agissait du * contenu * d'un fichier, mais il n'y a pas d'extension (.jmp, etc.), le second argument à ouvrir est donc nécessaire ("data", "script", etc. ). (En interne, open peut écrire le blob dans un emplacement temporaire, en fonction du sous-système qui le fera. Le script source Open ("/ 000000002A75C3D0 /" ... me dit que ce n’était pas écrit sur le disque, c’est ce que vous espérez.)Re: API Web ouvrant un fichier zip?Merci encore Craige!
Vous trouverez ci-dessous un exemple complet JSL avec les éléments suggérés mis en œuvre.
/* 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>
Fascinant que la spécification du format (blob) permette à la commande open de fonctionner, mais pas un format (texte).
Re: API Web ouvrant un fichier zip?try(deletefile("$temp/deleteme.zip"));
za = open("$temp/deleteme.zip","zip");
member = za<<WRITE></WRITE>
Ouvrir avec une goutte. utilisez charToBlob () si vous n'avez pas de blob.
Re: API Web ouvrant un fichier zip?Ce qui suit va créer un fichier texte pour l'ouverture, mais je ne peux pas m'empêcher de penser qu'il devrait y avoir un meilleur moyen.
Save Text File("$TEMP/" || FILENAME || Char(i) || ".txt",txt);
open("$TEMP/" || FILENAME || Char(i) || ".txt");
--Nate
Re: API Web ouvrant un fichier zip?Merci Craig!
Cela m'a presque fait tout le chemin. J'aurais pu jurer que j'ai essayé sans argument l'argument zip dans l'instruction ouverte (il y a de fortes chances que la casse ou la chaîne ne soient pas appropriées), mais avec votre exemple de code, j'ai pu obtenir les données lues!
//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>
Ma prochaine étape consiste à convertir TXT en une table.
Re: API Web ouvrant un fichier zip?essayez quelque chose comme ça:
za = ouvert (" http://someurl.that.downloads.a.zip "," zip "); // 2ème zip important!
show (za << membres);
txt = za << read ("member1"); // nom de la liste ci-dessus
za est l'objet ZipArchive dans l'index de script. l'url peut ne pas se terminer par .zip mais doit télécharger un zip.