Wie parse ich eine JSON-Datei, die über eine URL geöffnet wurde?Ich möchte eine aus dem Internet heruntergeladene JSON-Datei in JMP importieren. Der beste Weg, dies zu tun, ist über die GUI, manuelle Auswahl von Datei --> Öffnen --> und Eingabe der URL in "Dateiname". Wenn ich „JSON-Datendatei (*.json)“ aus der Dateitypliste auswähle, lädt JMP die Datei herunter und öffnet die geparsten Daten in einer neuen Datentabelle. Leider war ich nicht in der Lage, ein Skript zu schreiben, das diesen Prozess repliziert.
Eine einfache Öffne URL") Der Befehl speichert den JSON-Inhalt der URL im Protokoll und öffnet keine neue Datentabelle. Ich habe versucht, den Code zu ändern: open("URL","json") , aber dies gibt einen Fehler zurück und es werden keine Daten empfangen.
Ich kann rennen Textdatei speichern ("Ausgabepfad/Dateiname.json", öffnen ("URL")) und dann open("Ausgabepfad/Dateiname.json") und JMP parst die Datei automatisch in eine neue Datentabelle. Diese Problemumgehung erfüllt mein Ziel, aber die Verarbeitungszeit ist wesentlich länger als der im vorherigen Absatz beschriebene Prozess zum manuellen Datei-->Öffnen. Viele der URLs, die ich zu importieren versuche, enthalten große Datenmengen, daher möchte ich die Verarbeitungszeit so gering wie möglich halten.
Wie kann ich eine JSON-Datei direkt von einer URL herunterladen und die Daten in einer korrekt geparsten Tabelle öffnen?
Ich verwende JMP 13.0.0 unter Windows.
Betreff: Wie analysiert man eine JSON-Datei, die über eine URL geöffnet wurde?Hallo @jwebber ,
Freut mich zu hören, dass du eine Lösung finden konntest.
Ein Vorschlag, den ich hätte, wäre, RunProgram zu verwenden, um Ihre VBScript-Datei auszuführen, anstatt die Open-Funktion zu verwenden.
Durch die Verwendung von RunProgram wird sichergestellt, dass das Skript auf einem VBScript-Host ausgeführt wird, anstatt sich auf die Dateizuordnung des Computers für vbs-Dateien zu verlassen (die möglicherweise ein Texteditor sein könnten).
Ein weiterer Vorteil der Verwendung von RunProgram besteht darin, dass Sie die Option "Text" für die ReadFunction verwenden können, die Ihr JSL-Skript anhält, bis das VBScript abgeschlossen ist.
Nachfolgend finden Sie einige Informationen, die ich zuvor in der JMP-Community geteilt habe Hier .
Sie können entweder die ausführbaren WScript- oder CScript-Dateien verwenden, um eine VBScript-Datei mit RunProgram auszuführen. Der einzige Unterschied besteht darin, dass WScript Fehler in einer MessageBox anzeigt, während CScript den Fehler in die Konsole/Stdout schreibt.
Hier ist ein Beispiel mit 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>
Betreff: Wie analysiert man eine JSON-Datei, die über eine URL geöffnet wurde?Vielen Dank für Ihre Antworten. Am Ende habe ich dieses Problem umgangen, indem ich ein VB-Skript verwendet habe, um die .json-Datei von meiner URL herunterzuladen. Das Starten des Downloads mit VBS war viel schneller als jede Methode, die ich mit JMP finden konnte.
Glücklicherweise konnte ich für den gesamten Prozess immer noch JSL verwenden. Ich habe das VB-Skript in JSL geschrieben, die Daten mit einer .vbs-Erweiterung gespeichert und dann einen open()-Befehl von JSL ausgegeben, um das VB-Skript auszuführen (das dann meine Daten heruntergeladen hat).
Hier ist ein Beispiel für den Code, den ich verwendet habe:
//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");Betreff: Wie analysiert man eine JSON-Datei, die über eine URL geöffnet wurde?Offensichtlich habe ich Ihren ursprünglichen Beitrag nicht gründlich gelesen!
Sie wussten tatsächlich, dass der Wechsel zu JSON-Daten der richtige Weg war .... Ich bin froh, dass Sie das JSL-Äquivalent aus den anderen Antworten haben, und es hört sich so an, als müssten wir einige Leistungsarbeiten durchführen, um die Downloadzeit des Dialogfelds "Öffnen" aufzuholen.
John
Betreff: Wie analysiert man eine JSON-Datei, die über eine URL geöffnet wurde?JMP 13.2 gibt Ihnen etwas mehr Kontrolle darüber, wie die Datei geöffnet wird.Leider ist es nicht allzu offensichtlich, dass Sie das Verhalten kontrollieren können.Sie sollten in der Lage sein, das zu bekommen, was Sie brauchen.
Wenn die Erweiterung der eingehenden Datei JMP unbekannt ist, prüfen wir als Nächstes das Dropdown-Menü für den Dateityp rechts neben dem Bearbeitungsfeld. Wenn das eine Auswahl hat, die nicht mehrdeutig ist, öffnen wir die Datei unter der Annahme, dass es sich um eine Datei des ausgewählten Typs handelt. Wenn die Dropdown-Auswahl für den Dateityp mehrdeutig ist (z. B. Alle JMP-Dateien oder Alle Dateien), bitten wir das Betriebssystem, die Datei zu öffnen.
Also, in Ihrem Fall können Sie Folgendes versuchen:
* Fügen Sie die URL ein
* Ändern Sie die Dropdown-Liste von "Alle JMP-Dateien" entweder in "Textdaten" oder "JSON-Datendatei".
* [Optional] Sie können das Kontrollkästchen "Diesen Filter das nächste Mal auswählen ..." deaktivieren, wenn Sie nicht möchten, dass er gespeichert wird.
* OK klicken
Der Betriebssystemdialog lädt die Datei mit einem verrückten Namen wie FSERXVJW ohne Erweiterung an einen temporären Speicherort herunter. JMP versucht, die Datei mit dem Typ zu öffnen, den Sie im Dropdown-Menü ausgewählt haben.
Ich bin daran interessiert zu wissen, ob es schneller ist, wenn der Dialog Ihren JSON herunterlädt und mit der Auswahl „JSON-Datendatei“ öffnet als Open(„URL“, „json“); Route. In diesem Fall haben wir vielleicht noch gute Arbeit zu leisten ...
John
Betreff: Wie analysiert man eine JSON-Datei, die über eine URL geöffnet wurde?Schön, dass du das Update bekommen hast.
Kannst du ein Bild von den Tischen posten? Wenn es ein Quellskript gibt, poste das auch. Das Quellskript hat eine temporäre Datei anstelle der URL; das Öffnen erfolgt immer aus einer Datei, die von der URL heruntergeladen wurde. Sie sollten den temporären Dateinamen durch die URL ersetzen können. Es ist möglich, dass JMP 13 eine andere Methode zum Herunterladen der URL in eine temporäre Datei verwendet, wenn das Menü vs. JSL verwendet wird und möglicherweise schneller ist. Es ist auch möglich, dass Caching beteiligt ist.
Wenn die .json-Datei den CSV-Importcode durchläuft, bestimmen die Kommas und Zeilenumbrüche in der .json-Datei die Form der Datentabelle. Wenn der Schreiber der .json-Datei beschließt, andere Zeilenumbrüche einzufügen, erhalten Sie eine andere Datentabelle. Die Verwendung des .json-Imports trägt dazu bei, Ihren Code robuster gegenüber Änderungen in der .json-Datei zu machen.
Die open()-Funktion kann möglicherweise eine Dateierweiterung verwenden, um den Dateityp zu bestimmen. Der zusätzliche Parameter zum Öffnen überschreibt die Dateierweiterung und sollte wahrscheinlich mit einer URL verwendet werden, insbesondere wenn die URL möglicherweise vorhanden ist
?Parameter=Wert
ans Ende angehängt.
Betreff: Wie analysiert man eine JSON-Datei, die über eine URL geöffnet wurde?Ich habe meine Software auf v13.2 aktualisiert und kann jetzt meine URL öffnen und sie korrekt in eine neue Datentabelle parsen
open("my URL","json")Die Ausführung dieses Befehls ist immer noch wesentlich langsamer als der GUI-Befehl Datei-->Öffnen (die Verarbeitungszeit ist etwa doppelt so lang). Bei Verwendung der GUI erscheint ein Dialogfeld, das den Downloadstatus der Datei anzeigt, Informationen, die ich mit dem open() JSL-Befehl nicht erhalte. Schon vor meinem Upgrade konnte die GUI-Datei-->open die URL schnell öffnen und die Datei korrekt analysieren (die Ausgabe war anders als open("my URL",text)). Gibt es eine Möglichkeit, den Datei--> Prozess mit JSL genau zu replizieren? Gibt es eine Möglichkeit, den beim Ausführen von Datei -> Öffnen generierten Code aufzuzeichnen (ähnlich wie beim Aufzeichnen eines Makros in Excel der mithilfe der GUI generierte Code erfasst wird)?
Betreff: Wie analysiert man eine JSON-Datei, die über eine URL geöffnet wurde?Die JSON-Unterstützung wurde möglicherweise nach 13.0 hinzugefügt. Ich denke, die Datei, die Sie erhalten, entspricht wahrscheinlich der Verwendung von "text" anstelle von "json".
open("http://date.jsontest.com/", "text")
erzeugt diese Tabelle:
JSON data, not split up very wellJSON data, not split up very wellJSON-Daten, nicht sehr gut aufgeteilt
in JMP 13.2 mit
open("http://date.jsontest.com/","json")
Ich bekomme eine viel nützlichere Tabelle:
JSON data, split into columnsJSON data, split into columnsJSON-Daten, aufgeteilt in Spalten
Ich denke, wenn Sie "Text" angeben, erhalten Sie wahrscheinlich die Tabelle, die Sie unter Datei-> Öffnen sehen. Ich hoffe, Sie können auf 13.2 upgraden und den besseren JSON-Import nutzen.
Betreff: Wie analysiert man eine JSON-Datei, die über eine URL geöffnet wurde?Ich werde daran arbeiten, meine Software zu aktualisieren.
Ich bin mir immer noch nicht sicher, warum ich mit JSL die GUI-Datei nicht replizieren kann -> Prozess öffnen, der meine URL korrekt verarbeitet und eine neue Datentabelle öffnet. Es muss eine Möglichkeit geben, dieses Verfahren zu skripten, richtig?
Betreff: Wie analysiert man eine JSON-Datei, die über eine URL geöffnet wurde?Ich habe es gerade in JMP 13.0.0 versucht und den angezeigten Fehler repliziert. Ich verwende JMP 13.2 und es gibt kein Problem.
Könnten Sie auf 13.2 aktualisieren und es erneut versuchen? Sie können den Updater unter herunterladen jmp.com/update .
Betreff: Wie analysiert man eine JSON-Datei, die über eine URL geöffnet wurde?Danke für deine Antwort Justin. Ich habe Ihren Beispielcode ausgeführt und die folgende Fehlermeldung erhalten:
//:*/
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)Ich habe versucht, meiner URL die Erweiterung „,JSON“ hinzuzufügen, und habe die folgende Fehlermeldung erhalten:
//:*/
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)Gedanken?
Betreff: Wie analysiert man eine JSON-Datei, die über eine URL geöffnet wurde?Sie können die Option „JSON“ zur Funktion „Öffnen“ hinzufügen, um zu erzwingen, dass die JSON-Datei als Datentabelle geöffnet wird.
Open( "http://date.jsontest.com/", JSON );
Hier ist ein Vergleich aus dem Protokoll bei Verwendung dieser Option und Nichtverwendung der 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" )