Comment analyser un fichier JSON ouvert à partir d'une URL ?Je souhaite importer un fichier JSON dans JMP qui est téléchargé sur le Web. La meilleure façon dont j'ai pu le faire est via l'interface graphique, en sélectionnant manuellement Fichier --> Ouvrir --> et en entrant l'URL dans "Nom de fichier". Si je sélectionne "JSON Data File (*.json)" dans la liste des types de fichiers, JMP télécharge le fichier et ouvre les données analysées dans une nouvelle table de données. Malheureusement, je n'ai pas été en mesure d'écrire un script qui reproduit ce processus.
Un simple ouvrir le lien") La commande enregistre le contenu JSON de l'URL dans le journal et n'ouvre pas de nouvelle table de données. J'ai essayé de modifier le code pour: ouvre("URL","json") , mais cela renvoie une erreur et aucune donnée n'est reçue.
je peux courir enregistrer le fichier texte("chemin de sortie/nom du fichier.json",open("URL")) et puis open("chemin de sortie/nomfichier.json") et JMP analysera automatiquement le fichier dans une nouvelle table de données. Cette solution de contournement atteint mon objectif, mais le temps de traitement est nettement plus long que le fichier manuel -> processus d'ouverture décrit dans le paragraphe précédent. La plupart des URL que j'essaie d'importer contiennent de grandes quantités de données, j'aimerais donc minimiser autant que possible le temps de traitement.
Comment puis-je télécharger un fichier JSON directement à partir d'une URL et ouvrir les données dans une table correctement analysée ?
J'utilise JMP 13.0.0 sous Windows.
Re : Comment parser un fichier JSON ouvert à partir d'une URL ?Salut @jwebber ,
Heureux d'apprendre que vous avez pu trouver une solution.
Une suggestion que j'aurais est d'utiliser RunProgram pour exécuter votre fichier VBScript au lieu d'utiliser la fonction Open.
L'utilisation de RunProgram garantit que le script est exécuté sur un hôte VBScript au lieu de s'appuyer sur l'association de fichiers de l'ordinateur pour les fichiers vbs (qui pourrait potentiellement être un éditeur de texte).
Un autre avantage de l'utilisation de RunProgram est que vous pouvez utiliser l'option "texte" pour la ReadFunction qui mettra votre script JSL en pause jusqu'à ce que le VBScript soit terminé.
Vous trouverez ci-dessous des informations que j'ai précédemment partagées sur la communauté JMP ici .
Vous pouvez utiliser les exécutables WScript ou CScript pour exécuter un fichier VBScript à l'aide de RunProgram. La seule différence est que WScript affichera les erreurs dans une MessageBox, alors que CScript écrit l'erreur sur la console/stdout.
Voici un exemple utilisant CScript.
rp <SPAN class="token operator">=</SPAN> <SPAN class="token function">RunProgram</SPAN><SPAN class="token punctuation">(</SPAN> Executable<SPAN class="token punctuation">(</SPAN> <SPAN class="token string">"CSCRIPT.EXE"</SPAN> <SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">,</SPAN> Options<SPAN class="token punctuation">(</SPAN> <SPAN class="token string">"\!"</SPAN>C<SPAN class="token punctuation">:</SPAN>\runMe<SPAN class="token punctuation">.</SPAN>vbs\<SPAN class="token operator">!</SPAN><SPAN class="token string">""</SPAN> <SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">,</SPAN> Read <SPAN class="token function">Function</SPAN><SPAN class="token punctuation">(</SPAN> <SPAN class="token string">"text"</SPAN> <SPAN class="token punctuation">)</SPAN> <SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">;</SPAN>
Re : Comment parser un fichier JSON ouvert à partir d'une URL ?Merci à tous pour vos réponses. J'ai fini par contourner ce problème en utilisant un script VB pour télécharger le fichier .json à partir de mon URL. Lancer le téléchargement à l'aide de VBS était beaucoup plus rapide que n'importe quelle méthode que j'ai pu trouver avec JMP.
Heureusement, j'ai pu utiliser JSL pour l'ensemble du processus. J'ai écrit le script VB en JSL, enregistré les données avec une extension .vbs, puis émis une commande open() de JSL pour exécuter le script VB (qui a ensuite téléchargé mes données).
Voici un exemple du code que j'ai utilisé :
//define static VB script
one="dim xHttp: Set xHttp = createobject(\!"Microsoft.XMLHTTP\!")\!rdim bStrm: Set bStrm = createobject(\!"Adodb.Stream\!")\!r";
two="xHttp.Open \!"GET\!", \!"";
three="\!", False\!r";
four="xHttp.Send\!rwith bStrm\!r.type = 1\!r.open\!r.write xHttp.responseBody\!r";
five=".savetofile \!"C:\users\";
six="\desktop\data.json\!", 2\!rend with";
//define user.name
user.name="jwebber";
//define URL
url=www.somewebaddress.com;
//create full VB script
vbs=concat(one,two,url,three,four,five,user.name,six);
//save VB script
save text file("c:/users/"||user.name||"/desktop/download_data.vbs",vbs);
//open vbs file
open("c:/users/"||user.name||"/desktop/download_data.vbs");Re : Comment parser un fichier JSON ouvert à partir d'une URL ?De toute évidence, je n'ai pas lu votre message d'origine à fond!
Vous saviez en effet que le passage aux données JSON était la voie à suivre... Je suis heureux que vous ayez l'équivalent JSL des autres réponses et il semble que nous ayons du travail de performance à faire pour rattraper le temps de téléchargement de la boîte de dialogue Ouvrir.
John
Re : Comment parser un fichier JSON ouvert à partir d'une URL ?JMP 13.2 vous donne un peu plus de contrôle sur la façon dont le fichier est ouvert.Malheureusement, il n'est pas trop évident que vous puissiez contrôler le comportement.Vous devriez pouvoir obtenir ce dont vous avez besoin.
Si l'extension du fichier entrant est inconnue de JMP, nous allons ensuite vérifier la liste déroulante des types de fichiers à droite du champ d'édition. Si cela a une sélection qui n'est pas ambiguë, nous ouvrirons le fichier en supposant qu'il s'agit d'un fichier du type sélectionné. Si la sélection de la liste déroulante du type de fichier est ambiguë (ex. Tous les fichiers JMP ou Tous les fichiers), nous demandons au système d'exploitation d'ouvrir le fichier.
Donc, dans votre cas, vous pouvez essayer ceci:
* Collez l'URL
* Changez le menu déroulant de "Tous les fichiers JMP" en "Données texte" ou "Fichier de données JSON"
* [Facultatif] Vous pouvez décocher "Sélectionner ce filtre la prochaine fois..." si vous ne voulez pas qu'il soit mémorisé.
* Cliquez sur OK
La boîte de dialogue du système d'exploitation téléchargera le fichier dans un emplacement temporaire avec un nom fou comme FSERXVJW sans extension. JMP essaiera d'ouvrir le fichier avec le type que vous avez sélectionné dans la liste déroulante.
Je suis intéressé de savoir si la boîte de dialogue télécharge votre json et s'ouvre avec le choix "JSON Data File" est plus rapide que Open("URL","json"); itinéraire. On a peut-être du travail de perf à faire dans ce cas...
John
Re : Comment parser un fichier JSON ouvert à partir d'une URL ?Heureux que vous ayez la mise à jour.
Peux-tu poster une photo des tables ? S'il existe un script source, publiez-le également. Le script source aura un fichier temporaire plutôt que l'URL ; l'ouverture se fait toujours à partir d'un fichier qui a été téléchargé à partir de l'URL. Vous devriez pouvoir remplacer le nom du fichier temporaire par l'URL. Il est possible que JMP 13 utilise une méthode différente pour télécharger l'URL vers un fichier temporaire lorsque le menu vs JSL est utilisé et peut être plus rapide. Il est également possible que la mise en cache soit impliquée.
Lorsque le fichier .json passe par le code d'importation CSV, les virgules et les retours à la ligne dans le fichier .json vont déterminer la forme de la table de données. Si l'auteur du fichier .json décide de mettre des nouvelles lignes différentes, vous obtiendrez une table de données différente. L'utilisation de l'importation .json vous aidera à rendre votre code plus robuste face aux modifications du fichier .json.
La fonction open() peut utiliser une extension de fichier pour déterminer le type de fichier. Le paramètre supplémentaire à ouvrir remplacera l'extension de fichier et devrait probablement être utilisé avec une URL, surtout si l'URL peut avoir
?paramètre=valeur
ajouté à la fin.
Re : Comment parser un fichier JSON ouvert à partir d'une URL ?J'ai mis à jour mon logiciel vers la v13.2 et je peux maintenant ouvrir mon URL et la faire analyser correctement dans une nouvelle table de données en utilisant
open("my URL","json")L'exécution de cette commande est encore sensiblement plus lente que le fichier GUI -> commande open (le temps de traitement est environ deux fois plus long). Lors de l'utilisation de l'interface graphique, une boîte de dialogue apparaît indiquant l'état de téléchargement du fichier, des informations que je ne reçois pas avec la commande open() JSL. Même avant ma mise à niveau, le fichier GUI -> open était capable d'ouvrir rapidement l'URL et d'analyser correctement le fichier (la sortie était différente de open("my URL",text)). Existe-t-il un moyen de répliquer exactement le fichier -> processus ouvert à l'aide de JSL ? Existe-t-il un moyen d'enregistrer le code généré lors de l'exécution du fichier -> ouvrir (similaire à la façon dont l'enregistrement d'une macro dans Excel capture le code généré à l'aide de l'interface graphique) ?
Re : Comment parser un fichier JSON ouvert à partir d'une URL ?Le support json a peut-être été ajouté après 13.0. Je pense que le fichier que vous obtenez équivaut probablement à utiliser "text" plutôt que "json".
open("http://date.jsontest.com/", "text")
produit ce tableau :
JSON data, not split up very wellJSON data, not split up very wellDonnées JSON, pas très bien divisées
dans JMP 13.2, en utilisant
open("http://date.jsontest.com/","json")
J'obtiens un tableau beaucoup plus utile:
JSON data, split into columnsJSON data, split into columnsDonnées JSON, divisées en colonnes
Je pense que si vous spécifiez "texte", vous obtiendrez probablement le tableau que vous voyez dans Fichier-> Ouvrir. J'espère que vous pourrez passer à la version 13.2 et profiter de la meilleure importation JSON.
Re : Comment parser un fichier JSON ouvert à partir d'une URL ?Je vais travailler sur la mise à jour de mon logiciel.
Je ne sais toujours pas pourquoi, en utilisant JSL, je ne peux pas répliquer le fichier GUI -> processus ouvert qui gère correctement mon URL et ouvre une nouvelle table de données. Il doit y avoir un moyen de scripter cette procédure, n'est-ce pas ?
Re : Comment parser un fichier JSON ouvert à partir d'une URL ?Je viens d'essayer dans JMP 13.0.0 et j'ai reproduit l'erreur que vous voyez. J'utilise JMP 13.2 et il n'y a aucun problème.
Pourriez-vous mettre à jour vers 13.2 et réessayer ? Vous pouvez télécharger le programme de mise à jour sur jmp.com/update .
Re : Comment parser un fichier JSON ouvert à partir d'une URL ?Merci pour votre réponse Justin. J'ai exécuté votre exemple de code et j'ai reçu l'erreur suivante :
//:*/
open("http://date.jsontest.com/", JSON)
/*:
Unexpected "M". Perhaps there is a missing [ or {.
Line 1 Column 1: ►M",
Tried to open: http://date.jsontest.com/
Cannot open table in access or evaluation of 'Open' , Open/*###*/("http://date.jsontest.com/", JSON)
In the following script, error marked by /*###*/
Open/*###*/("http://date.jsontest.com/", JSON)J'ai essayé d'ajouter l'extension ",JSON" à mon URL et j'ai reçu l'erreur suivante :
//:*/
open("my URL",JSON)
/*:
Unexpected "sponseTime". Perhaps there is a missing [ or {.
Line 1 Column 1: ►sponseTime":"2017-09-19T13:33:38.9224228+00:00","S
Tried to open: my URL
Cannot open table in access or evaluation of 'Open' , Open/*###*/(
"my URL",
JSON)
In the following script, error marked by /*###*/
Open/*###*/(
"my URL",
JSON)Pensées?
Re : Comment parser un fichier JSON ouvert à partir d'une URL ?Vous pouvez ajouter l'option "JSON" à la fonction Ouvrir pour forcer l'ouverture du fichier JSON en tant que table de données.
Open( "http://date.jsontest.com/", JSON );
Voici une comparaison du journal lors de l'utilisation de cette option par rapport à la non-utilisation de l'option :
open("http://date.jsontest.com/")
/*:
"{
\!"time\!": \!"01:21:07 PM\!",
\!"milliseconds_since_epoch\!": 1505827267889,
\!"date\!": \!"09-19-2017\!"
}
"
//:*/
open("http://date.jsontest.com/", JSON)
/*:
Data Table( "date.jsontest.com" )