¿Cómo analizar un archivo JSON abierto desde la URL?Me gustaría importar un archivo JSON a JMP que se descarga de la web. La mejor manera en que he podido hacer esto es a través de la GUI, seleccionando manualmente Archivo -> Abrir -> e ingresando la URL en "Nombre de archivo". Si selecciono "Archivo de datos JSON (*.json)" de la lista de tipos de archivos, JMP descargará el archivo y abrirá los datos analizados en una nueva tabla de datos. Desafortunadamente, no he podido escribir un script que replique este proceso.
Un simple abrir("URL") El comando guarda el contenido JSON de la URL en el registro y no abre una nueva tabla de datos. Intenté modificar el código a: abierto("URL","json") , pero esto devuelve un error y no se reciben datos.
puedo correr guardar archivo de texto ("ruta de salida/nombre de archivo.json", abrir ("URL")) y luego open("ruta de salida/nombre de archivo.json") y JMP analizará automáticamente el archivo en una nueva tabla de datos. Esta solución alternativa logra mi objetivo, pero el tiempo de procesamiento es sustancialmente más largo que el archivo manual-->proceso abierto descrito en el párrafo anterior. Muchas de las URL que intento importar contienen grandes cantidades de datos, por lo que me gustaría minimizar el tiempo de procesamiento tanto como sea posible.
¿Cómo puedo descargar un archivo JSON directamente desde una URL y abrir los datos en una tabla analizada correctamente?
Estoy ejecutando JMP 13.0.0 en Windows.
Re: ¿Cómo analizar un archivo JSON abierto desde una URL?Hola @jwebber ,
Me alegra saber que pudiste encontrar una solución.
Una sugerencia que tendría es usar RunProgram para ejecutar su archivo VBScript en lugar de usar la función Abrir.
El uso de RunProgram garantiza que la secuencia de comandos se ejecute en un host de VBScript en lugar de depender de la asociación de archivos de la computadora para archivos vbs (que podría ser un editor de texto).
Otro beneficio de usar RunProgram es que puede usar la opción de "texto" para ReadFunction que pausará su script JSL hasta que se complete el VBScript.
A continuación hay información que compartí anteriormente en la comunidad JMP aquí .
Puede usar los ejecutables WScript o CScript para ejecutar un archivo VBScript usando RunProgram. La única diferencia es que WScript mostrará errores en un cuadro de mensaje, mientras que CScript escribe el error en la consola/salida estándar.
Aquí hay un ejemplo usando 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: ¿Cómo analizar un archivo JSON abierto desde una URL?Gracias por sus respuestas a todos. Terminé solucionando este problema usando un script de VB para descargar el archivo .json de mi URL. Iniciar la descarga usando VBS fue mucho más rápido que cualquier método que pude encontrar con JMP.
Afortunadamente, todavía pude usar JSL para todo el proceso. Escribí el script de VB en JSL, guardé los datos con una extensión .vbs y luego emití un comando open() desde JSL para ejecutar el script de VB (que luego descargó mis datos).
Aquí hay un ejemplo del código que usé:
//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: ¿Cómo analizar un archivo JSON abierto desde una URL?¡Claramente, no leí su publicación original a fondo!
De hecho, sabía que cambiar a datos JSON era el camino a seguir.... Me alegro de que tenga el equivalente JSL de las otras respuestas y parece que tenemos algo de trabajo de rendimiento que hacer para ponernos al día con el tiempo de descarga del cuadro de diálogo Abrir.
John
Re: ¿Cómo analizar un archivo JSON abierto desde una URL?JMP 13.2 le brinda un poco más de control sobre cómo se abre el archivo.Desafortunadamente, no es demasiado obvio que puedas controlar el comportamiento.Debería poder obtener lo que necesita.
Si JMP desconoce la extensión del archivo entrante, a continuación revisaremos el menú desplegable de tipo de archivo a la derecha del campo de edición. Si tiene una selección que no es ambigua, abriremos el archivo asumiendo que es un archivo del tipo seleccionado. Si la selección desplegable del tipo de archivo es ambigua (p. ej., Todos los archivos JMP o Todos los archivos), le pedimos al sistema operativo que abra el archivo.
Entonces, en tu caso puedes probar esto:
* Pegar la URL
* Cambie el menú desplegable de "Todos los archivos JMP" a "Datos de texto" o "Archivo de datos JSON"
* [Opcional] Es posible que desee desmarcar "Seleccionar este filtro la próxima vez..." si no desea que se recuerde.
* Haga clic en Aceptar
El cuadro de diálogo del sistema operativo descargará el archivo en una ubicación temporal con un nombre loco como FSERXVJW sin extensión. JMP intentará abrir el archivo con el tipo que seleccionó en el menú desplegable.
Me interesa saber si hacer que el cuadro de diálogo descargue su json y se abra con la opción "Archivo de datos JSON" es más rápido que Abrir ("URL", "json"); ruta. Es posible que tengamos mucho trabajo que hacer en ese caso...
John
Re: ¿Cómo analizar un archivo JSON abierto desde una URL?Me alegro de que hayas recibido la actualización.
¿Puedes poner una foto de las mesas? Si hay un script de origen, publíquelo también. El script de origen tendrá un archivo temporal en lugar de la URL; la apertura siempre se realiza desde un archivo que se descargó de la URL. Debería poder reemplazar el nombre del archivo temporal con la URL. Es posible que JMP 13 use un método diferente para descargar la URL a un archivo temporal cuando se usa el menú vs JSL y podría ser más rápido. También es posible que el almacenamiento en caché esté involucrado.
Cuando el archivo .json pasa por el código de importación CSV, las comas y los saltos de línea en el archivo .json determinarán la forma de la tabla de datos. Si el escritor del archivo .json decide colocar nuevas líneas diferentes, obtendrá una tabla de datos diferente. El uso de la importación .json ayudará a que su código sea más sólido frente a los cambios en el archivo .json.
La función open() podría usar una extensión de archivo para determinar el tipo de archivo. El parámetro adicional para abrir anulará la extensión del archivo y probablemente debería usarse con una URL, especialmente si la URL podría tener
?parámetro=valor
adjunto al final.
Re: ¿Cómo analizar un archivo JSON abierto desde una URL?Actualicé mi software a v13.2 y ahora puedo abrir mi URL y analizarla correctamente en una nueva tabla de datos usando
open("my URL","json")Ejecutar este comando sigue siendo sustancialmente más lento que el comando archivo-->abrir de GUI (el tiempo de procesamiento es aproximadamente el doble). Al usar la GUI, aparece un cuadro de diálogo que muestra el estado de descarga del archivo, información que no recibo con el comando open() JSL. Incluso antes de mi actualización, el archivo GUI-->open podía abrir rápidamente la URL y analizar correctamente el archivo (el resultado era diferente a open("my URL",text)). ¿Hay alguna forma de replicar exactamente el archivo -> proceso abierto usando JSL? ¿Hay alguna forma de registrar el código generado al ejecutar el archivo-->abrir (similar a la forma en que la grabación de una macro en Excel captura el código generado mediante la GUI)?
Re: ¿Cómo analizar un archivo JSON abierto desde una URL?Es posible que se haya agregado la compatibilidad con json después de 13.0. Creo que el archivo que está obteniendo probablemente sea equivalente a usar "texto" en lugar de "json".
open("http://date.jsontest.com/", "text")
produce esta tabla:
JSON data, not split up very wellJSON data, not split up very wellDatos JSON, no se dividen muy bien
en JMP 13.2, usando
open("http://date.jsontest.com/","json")
Obtengo una tabla mucho más útil:
JSON data, split into columnsJSON data, split into columnsDatos JSON, divididos en columnas
Creo que si especifica "texto", probablemente obtendrá la tabla que ve en Archivo->Abrir. Espero que pueda actualizar a 13.2 y aprovechar la mejor importación de JSON.
Re: ¿Cómo analizar un archivo JSON abierto desde una URL?Trabajaré en la actualización de mi software.
Todavía no estoy seguro de por qué, usando JSL, no puedo replicar el archivo GUI-->proceso abierto que maneja correctamente mi URL y abre una nueva tabla de datos. Debe haber alguna forma de programar este procedimiento, ¿verdad?
Re: ¿Cómo analizar un archivo JSON abierto desde una URL?Acabo de probar en JMP 13.0.0 y reproduje el error que está viendo. Estoy usando JMP 13.2 y no hay problema.
¿Serías capaz de actualizar a 13.2 e intentarlo de nuevo? Puede descargar el actualizador en jmp.com/actualizar .
Re: ¿Cómo analizar un archivo JSON abierto desde una URL?Gracias por tu respuesta, Justin. Ejecuté su código de ejemplo y recibí el siguiente error:
//:*/
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)Intenté agregar la extensión ",JSON" a mi URL y recibí el siguiente error:
//:*/
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)¿Pensamientos?
Re: ¿Cómo analizar un archivo JSON abierto desde una URL?Puede agregar la opción "JSON" a la función Abrir para forzar que el archivo JSON se abra como una tabla de datos.
Open( "http://date.jsontest.com/", JSON );
Aquí hay una comparación del registro cuando se usa esta opción frente a no usar la opción:
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" )