//############################################ ############################### //### //### 8. Trabajar con archivos y bases de datos externos //### //################################### ########################################## // En este archivo cubriremos: // - Breve resumen de la sesión 7 (alcance/espacios de nombres y capa de informe) // - .xlsx // - archivos de texto // - archivos xml // - archivos json // - Solicitud GET // - DLL ( Consulte la Sesión 5) // - ARCHIVOS POR LOTES (Consulte la Sesión 5) // - Bases de datos (usando la base de datos .sqlite) // - imágenes // - pdf //################ ############################################## ################ //### Resumen de la sesión 7 (Propiedades de alcance y capa de informe) //
https://www.jmp.com/support/help/en/ 17.0/#page/jmp/ámbito-avanzado-y-espacios-de-nombres.shtml#ww339298 //
https://www.jmp.com/support/help/en/17.0/#page/jmp/mejores-practicas-para-avanzado -scripting.shtml# //
https://www.jmp.com/support/help/en/17.0/#page/jmp/show-symbols-clear-symbols-and-delete-symbols.shtml //### ############################################## ############################ // Ámbito y espacios de nombres // Comience sus scripts con Nombres predeterminados aquí (1); // Habilitar el modo Nombres predeterminados hasta aquí asocia un alcance llamado Aquí con un script en ejecución // No deje el siguiente código de producción ya que romperá otros scripts Clear Symbols(); Borrar Globales(); Eliminar Símbolos(); Eliminar Globales(); // Para ver qué mensajes tiene el objeto, puede usar Mostrar propiedades (obj); // Capa de informe // Para explorar la capa de informe, utilice obj << Mostrar propiedades; y obj << Mostrar estructura de árbol; (obj << Obtener XML;) // Obtenga acceso a la capa del informe usando rep = obj << Informe; o Informe(obj); // Subíndice del informe (devuelve la primera coincidencia) param_tratio2 = biv_report[Outline Box("Estimaciones de parámetros"), Number Col Box("t Ratio")]; // Usar obj << Obtener XML; para ver cómo se ve XML antes de usar XPath // XPath (devuelve una lista de coincidencias Y puede enviar mensajes a una lista) biv_report << XPath("//OutlineBox[contains(text(), 'Bivariate Normal Ellipse')]" ); //############################################# ############################### //### //### Trabajar con archivos externos // ### //########################################## ################################## //########### ############################################## #################### //### Recordatorios de tabla de datos JMP (ver sesión 6) //############# ############################################## ################### dt = Open("$SAMPLE_DATA/Big Class.jmp"); // Invisible, Privado m_num = dt << obtener como matriz; nombres = Columna(dt, "nombre") << Obtener Valores; todos_vals = dt[0, 0]; // lista de listas dt[0, {"altura", "peso"}]; // matriz porque las columnas son numéricas Close(dt, no save); //############################################# ################################## //### Archivo Excel //####### ############################################## ######################## // Abrir con interactivo Abrir primero para obtener la configuración básica y modificar según sea necesario // o ver la sintaxis de Scripting Index y espero lo mejor dt = Open( "$SAMPLE_IMPORT_DATA/Team Results.xlsx", Worksheets("Ungrouped Team Results"), Worksheet Settings(Los encabezados comienzan en la fila(3), los datos comienzan en la fila(4))); // Guardar la tabla de datos jmp como libro de Excel dt = Open("$SAMPLE_DATA/Big Class.jmp", invisible); dt << Guardar (Obtener directorio predeterminado () || "BigClass.xlsx"); // guardar en el mismo directorio en el que se guarda este script // Crear como libro de Excel dt2 = Open("$SAMPLE_DATA/Abrasion.jmp", invisible); Crear libro de Excel (Obtener directorio predeterminado() || "MyWorkbook.xlsx", {dt, dt2}, {"Big", "Abrasive"}); Cerrar (dt, sin guardar); Cerrar (dt2, sin guardar); Abrir (Obtener directorio predeterminado ()); Try(Delete File(Get Default Directory() || "BigClass.xlsx")); Try(Delete File(Get Default Directory() || "MyWorkbook.xlsx")); //############################################# ############################### //### Archivos de texto //####### ############################################## ####################### txt1 = Cargar archivo de texto("$SAMPLE_IMPORT_DATA/Animals.txt"); txt2 = Cargar archivo de texto ("$SAMPLE_IMPORT_DATA/Animals_L.txt"); dt_txt = Abrir("$SAMPLE_IMPORT_DATA/Animals_L.txt"); // si los datos tienen un formato limpio, Open() podría funcionar Guardar archivo de texto (Obtener directorio predeterminado() || "example.txt", "line1\!Nline2\!N", mode("replace")); Guardar archivo de texto (Obtener directorio predeterminado() || "example.txt", "line3\!Nline4\!N", mode("append")); txt4 = Cargar archivo de texto (Obtener directorio predeterminado() || "ejemplo.txt"); Try(Delete File(Get Default Directory() || "example.txt")); // Para leer texto línea por línea, use Words() con el separador correcto // Algunos posibles separadores, \!N, \!r, \!n all_lines = Words(txt2, "\!N"); For Each({line}, all_lines, show(line); //Show(Words(line, "\!t")); ); // Algunos trucos abriendo como script y usando ScriptBox my_scriptwindow = Open("$SAMPLE_IMPORT_DATA/Animals_L.txt", "script"); my_scriptwindow << Mostrar ventana(0); myfile_lines = my_scriptwindow[scriptBox(1)] << getLines(); my_scriptwindow << cerrar ventana; esperar (0); show(todas_líneas, mis_líneas_script); txt3_line3 = Cargar archivo de texto ("$SAMPLE_IMPORT_DATA/Animals_line3.txt"); // los datos comienzan en la línea 3 // Dependiendo de lo que desee hacer, puede eliminar las líneas innecesarias (1 y 2) líneas = Palabras(txt3_línea3, "\!N"); // tenga cuidado con Words() ya que combinará los separadores Remove From(lines, 1, 1); // y luego guárdelo, vuelva a abrir o cree una tabla mediante un bucle o simplemente Abrir con Blob // Avanzado... puede usar Blob con Abrir. Hay una explicación en algún lugar de la comunidad por
@Craige_Hales dt = Open(Char To Blob(Concat Items(lines, "\!N")), "text"); //"texto" debe estar aquí //##################################### ###################################### //### Archivos XML / /############################################# ############################### // Pocas veces he usado esto, pero este script puede dar una idea / / Analizar XML, XML Attr y XML Text file_contents = Cargar archivo de texto ("$SAMPLE_IMPORT_DATA/BigclassExcel.xml"); Parse XML(file_contents, OnElement( "Hoja de trabajo", StartTag( nombrehoja = XML Attr("Nombre"); show(nombrehoja); dt = Nueva tabla(nombrehoja); fila = 1; col = 1; ) ), OnElement( " Row", StartTag( If(row > 1, // asume que la primera fila son nombres de columna dt << addRows(1) ) ), EndTag( row++; col = 1; ) ), OnElement("Cell", EndTag(col++) ), OnElement( "Data", EndTag( data = XML Text(collapse); If(row == 1, New Column(data, character(10)), // asume que la primera fila tiene nombres de columna Column(col)[row - 1] = datos// y otras filas tienen datos ); ) ) ); // Abrir con exportación XML realizada con interactive. Podría haber formas de hacer que esto funcione. Libro de trabajo/Hoja de trabajo/Tabla/Fila/Celda/Datos", Nombre de columna ("Datos"), Relleno ("Usar una vez"), Tipo ("Carácter"), Formato ("Mejor"}), Tipo de modelo ("Continuo ") ) ), XML Wizard(1) // XML Wizard(0) para deshabilitar ui ); //############################################# ################################ //### Archivos DLL y por lotes (consulte la Sesión 5 (Cargar DLL y ejecutar programa()) //####################################### ##################################### // DLL // Ver https:// docs.microsoft.com/en-us/windows/win32/api/ F_getScreenSize = Function({}, {Local predeterminado}, securDll = Cargar DLL("user32.dll", autoDeclare(false)); securDll << DeclareFunction( "GetSystemMetrics", Arg(Int32), devuelve (Int32)); size_x = 0; size_y = 0; mode_x = 0; mode_y = 1; size_x = securDll << GetSystemMetrics(mode_x); size_y = securDll << GetSystemMetrics(mode_y) ; Return(Eval List({size_x, size_y})); ); myScreenSize = F_getScreenSize(); // Archivo por lotes (.bat) // Una nota rápida sobre los archivos por lotes // - Sin espacios finales // - Debe agregar un 'NewLine' mybat_string = " echo off \!n cls \!n echo Hello World \!n echo La hora es " || Char(MDYHMS(Today())) || " \!n "; mybat_path = Obtener directorio predeterminado () || "testbatch.bat"; Guardar archivo de texto (mybat_path, mybat_string, Mode("replace")); // Si necesitamos devolver el resultado, puede usar Ejecutar programa bat_path = Convert File Path(mybat_path, windows); rp1 = Ejecutar programa (Executable (bat_path), ReadFunction ("texto")); Show(El directorio existe("C:\SCRIPTERSCLUBTEST")); mybat_string2 = "\[mkdir "C:\SCRIPTERSCLUBTEST\" \!n]\"; mybat_path = Obtener directorio predeterminado() || "testbatch.bat"; mybat_path = Convertir ruta de archivo (mybat_path, windows); Guardar archivo de texto (mybat_path, mybat_string2, Mode ("replace")); Open(mybat_path); // esto ejecutará bat Show(Directory Exists("C:\SCRIPTERSCLUBTEST")); esperar(3); // tendremos que esperar Show(Directory Exists("C:\SCRIPTERSCLUBTEST")); // O use DLL Try(Delete Directory("C:\SCRIPTERSCLUBTEST")); esperar (0); Show(El directorio existe("C:\SCRIPTERSCLUBTEST")); kernel32 = CargarDLL("Kernel32"); kernel32 << DeclareFunction( "WinExec", Convención(STDCALL), Alias("WinExec"), Arg(AnsiString, "lpCmdLine"), Arg(Int32, "uCmdShow"), Returns(Int32) ); kernel32 << WinExec(mybat_path, 5); Show(El directorio existe("C:\SCRIPTERSCLUBTEST")); esperar(3); // tendremos que esperar. El tiempo depende de .bat ejecutó Show(Directory Exists("C:\SCRIPTERSCLUBTEST")); Try(Delete File(mybat_path)); Try(Delete Directory("C:\Users\SCRIPTERSCLUBTEST")); //############################################# ################################ //### Archivos JSON //### hay muchos funciones, índice de secuencias de comandos de búsqueda para "JSON" //##################################### ######################################## json1 = Cargar archivo de texto (Obtener Directorio predeterminado() ||"Big Class_column.json", "JSON"); // matriz asociativa json2 = Cargar archivo de texto (Obtener directorio predeterminado() ||"Big Class_row.json"); // cadena // Analizar JSON(json2); // Uso de Open interactivo con vista previa dt = Open( "/H:/JSL Course/session 8/Big Class_row.json", JSON Settings( Stack(0), Row("/root"), Col("/root/ nombre", Nombre de columna("nombre"), Relleno("Usar una vez"), Tipo("Carácter"), Formato({"Mejor"}), Tipo de modelado("Continuo")), Col("/raíz/ edad", Nombre de columna("edad"), Relleno("Usar una vez"), Tipo("Numérico"), Formato({"Mejor"}), Tipo de modelado("Continuo")), Col("/raíz/ sexo", Nombre de columna ("sexo"), Relleno ("Usar una vez"), Tipo ("Carácter"), Formato ("Mejor"}), Tipo de modelado ("Continuo")), Col ("/raíz/ altura", Nombre de columna("altura"), Relleno("Usar una vez"), Tipo("Numérico"), Formato({"Mejor"}), Tipo de modelado("Continuo")), Col("/raíz/ peso", Nombre de columna ("peso"), Relleno ("Usar una vez"), Tipo ("Numérico"), Formato ("Mejor"}), Tipo de modelado ("Continuo")), Asistente JSON (0) ); // Si el formato JSON es fácil de usar para JMP, solo Open podría funcionar dt2 = Open(Get Default Directory() ||"Big Class_row.json"); // A veces puede ser útil usar el truco Open(Blob()) dt3 = Open(Char To Blob(json2), "json"); // abrir texto en la tabla Try(Close(dt, no save)); Try(Cerrar(dt2, no guardar)); Try(Cerrar(dt3, no guardar)); // JSON a AA y AA a JSON my_json_str = "{ \!"myChar\!": \!"Valor del carácter\!", \!"miNum\!": 12345}"; aa_json = Analizar JSON(my_json_str); json_str = Como JSON Expr(aa_json); // volver a JSON // aa_json2 = Analizar JSON(json_str); //############ ############################################## ################### //### Solicitudes HTTP (GET) //################## ############################################## ############## // puede usarse para probar solicitudes simples
https://httpbin.org/ request = New HTTP Request( URL("
https://httpbin.org//get "), Método ("GET"), Tiempo de espera (5) // el valor predeterminado es 60. Sugiero modificarlo según sea necesario y dependiendo del servidor); datos = solicitud << Enviar; // Consulte el índice de secuencias de comandos para obtener más mensajes relacionados con la nueva solicitud HTTP // solicitud << Obtener la última URL; // solicitud << Obtener estado; aa_json = Analizar JSON (datos); //############################################# ################################ //### Trabajando con bases de datos (sqlite select) // https: //community.jmp.com/t5/Discussions/Qué-camino-a-ir-consultar-base-de-datos/mp/655026 //
https://www.jmp.com/support/help/en/17.0/#page/ jmp/sql-functions.shtml#ww5089351 //
https://www.jmp.com/support/help/en/17.0/#page/jmp/sql-messages.shtml# //######## ############################################## ####################### // El formato general (que yo sepa) para la cadena de conexión es // connection_str ="DSN=MYDSN_NAME;UID=USERNAME; PWD=CONTRASEÑA"; // dsn_string = "Driver={ODBC DRIVER};Dbq=DBDSNNAME;UID=DBDSNNAME;PWD=DBPASSWORD;"; (la parte del controlador no siempre es necesaria) // Cuando se utiliza la nueva consulta SQL, debe agregar el prefijo ODBC: //dsn_string = "ODBC:Driver={ODBC DRIVER};Dbq=DBDSNNAME;UID=DBUSERNAME;PWD=DBPASSWORD; "; // Si puede crear una consulta utilizando el Generador de consultas de JMP para su base de datos, puede obtener una cadena de conexión desde allí // puede contener mucha más información, pero lo más probable es que pueda simplificarla // ESTOS SON DEPENDIENTES DE SU BASE DE DATOS // El departamento de TI podría ayudar con estos //
https://learn.microsoft.com/en-us/sql/integration-services/import-export-data/connect-to-an-odbc-data-source-sql -server-import-and-export-wizard?view=sql-server-ver16 //
https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_4406003916.html#Connecting- Uso de una cadena de conexión // También tenga cuidado al compartir tablas que tienen scripts de tabla creados por consulta de base de datos, ya que pueden contener contraseñas // Ocultar la preferencia de cadena de conexión ODBC podría ayudar con esto (
https://community.jmp.com/ t5/JMP-Knowledge-Base/Database-table-scripts-Update-from-Database-Modify-etc-or/ta-p/621050) sqlite_path = Obtener directorio predeterminado() || "QCdata.sqlite"; connection_str = Eval Insert("SQLite:Database=^sqlite_path^"); sql_str = "seleccionar * del lote"; // Abrir base de datos dt = Abrir base de datos(connection_Str, sql_str, "NewTable"); // Crear conexión de base de datos, ejecutar SQL, cerrar conexión de base de datos dbc = Crear conexión de base de datos (connection_str); dt = Ejecutar SQL(dbc, sql_str, "NewTable"); Cerrar conexión de base de datos (dbc); // Nueva consulta SQL (que yo sepa, este es el método preferido) sql_obj = Nueva consulta SQL (Connection (connection_str), SQL personalizado (sql_str)); dt = sql_obj << Ejecutar; // usa las preferencias jmp de los usuarios dt = sql_obj << Run Background; // Permitirá que JMP funcione dt = sql_obj << Run Foreground; // Bloqueará la ejecución de JMP hasta que finalice la consulta // Puede configurar las secuencias de comandos OnRunComplete en Nueva consulta SQL (ver índice de secuencias de comandos) sql_obj << Run Foreground(OnRunComplete(Write("Número de filas en el resultado de la consulta: ", N Rows(queryResult) ))); // no se imprimirá en el registro incrustado // También hay OnRunCanceled y OnError // Algunos "consejos" de SQL // Use el patrón connection_str y sql_template (incluso podría guardarlos en archivos .jsl simples) dsn_string = Eval Insert("SQLite: Base de datos=^sqlite_path^"); sql_template = "\[select * from lot where lot in (¤lotnr¤)]\"; lotenr = "'API00017'"; sql_str = Insertar evaluación (sql_template, "¤"); // inserte valores en su plantilla sql_obj = Nueva consulta SQL (Conexión (dsn_string), SQL personalizado (sql_str)); dt = sql_obj << Ejecutar en primer plano; lotnr = "'API00017', 'API00058'"; sql_str = Insertar evaluación (sql_template, "¤"); sql_obj = Nueva consulta SQL (Conexión (dsn_string), SQL personalizado (sql_str)); dt = sql_obj << Ejecutar en primer plano; // Si las consultas a la base de datos no arrojan errores y puede intentar usar Log Capture() para capturar problemas sql_error = Log Capture(dt = Open Database(connection_Str, sql_str, "NewTable")); mostrar (sql_error); If(Contains(sql_error, "[Administrador de controladores ODBC]"), Throw(sql_error); ); // Podría ser una buena idea comprobar si dt está vacío o no tiene filas Is Empty(dt10); N filas (dt); // esto generará un error si dt no existe // Use Query para realizar consultas SQL con tablas de datos OPEN JMP dt = Open("$SAMPLE_DATA/Big Class.jmp", Invisible); dt_result = Query(dt, "SELECCIONE nombre, edad, altura DESDE 'Clase grande' DONDE edad > 14;" ); // Utilizando alias, realizando una unión dtSAT = Open("$SAMPLE_DATA/SATByYear.jmp", Invisible); dtUS = Open("$SAMPLE_DATA/US Demographics.jmp", Invisible); dt_result2 = Query( Table(dtSAT, "t1"), Table(dtUS, "t2"), "\[SELECT t1.State, t1."SAT Math", t2."Títulos universitarios", t2."Matemáticas de octavo grado " DESDE t1 IZQUIERDA EXTERNA ÚNETE t2 EN t1.Estado = t2.Estado DONDE t1.'SAT Math' > 550; ]\" ); // Consulta que devuelve un valor escalar retval1 = Consulta (Escalar, dt, "SELECCIONAR PROMEDIO (altura) de 'Clase grande';"); // Consulta sin tablas retval2 = Query(Scalar, "SELECT SQRT(152399025);"); // podría hacerse sin sql, pero es bueno tener opciones avg_height = Col Mean(Column(dt, "height")); sqrt_val = Sqrt(152399025); // funciones disponibles
https://www.jmp.com/support/help/en/16.2/#page/jmp/sql-functions-available-for-jmp-queries.shtml#ww998370 // Hay tareas que a veces son más fácil de realizar con SQL (si puede escribir la consulta) que con JMP dt = Open("$SAMPLE_DATA/Big Class.jmp", Invisible); // un ejemplo podría ser la concatenación de valores en una sola columna por grupo // Esto puede ser útil antes del resumen o la división, por ejemplo, para evitar la pérdida de datos dt_result = Query(dt, "\[SELECT age, group_concat(name, ', ') nombres DEL GRUPO 'Clase grande' POR edad]\"); //############################################# ################################ //### archivos zip (índice de secuencias de comandos para más) // https

/
www.jmp.com/support/help/en/16.2/#page/jmp/zip-archives.shtml?os=win&source=application#1931138 //############# ############################################## ################### za = Abrir(Obtener directorio predeterminado() || "carpeta1.zip", zip); // abrir como objeto de archivo zip dirlist = za << dir; // devuelve la lista de miembros de la lista za << Write("newfile.txt", "this is newfiledata"); // escribir nuevo archivo dirlist = za << dir; // texto = za << Read(dirlist[2]); // leer del archivo zip // Comprimir la carpeta en un archivo Zip (
@Justin_Chilton) //
https://community.jmp.com/t5/JSL-Cookbook-Archived/Compress-a-Folder-into-a-Zip- Archivo/ta-p/48878 //####################################### ##################################### //### Importación de archivos múltiples ( MFI) //
https://www.jmp.com/support/help/en/16.2/#page/jmp/utility-functions.shtml?os=win&source=application#ww7168938 //### Puede ser útil cuando tenga varios archivos .csv de aspecto similar, por ejemplo //### Pruébelo primero de forma interactiva y luego copie el script //### También puede obtener una lista de archivos usando Files In Directory() y recorrerlos pero //# ## MFI tiene funciones adicionales //####################################### ##################################### mfi = Importación de archivos múltiples ( <, Añadir filas(Página(n), , Rect(superior, izquierda, derecha, inferior), , ), ...)) | PDF Todas las tablas (< Combinar (Todos | Encabezados coincidentes | Ninguno)>, , ) | Texto PDF (, ) | PDF Wizard );*/ dt = Open("$SAMPLE_DATA\Big Class.jmp"); w = Nueva ventana ("prueba", cuadro de tabla de datos (dt)); w << guardar imagen(Obtener directorio predeterminado() || "test.pdf", pdf); w << cerrar ventana; close(dt, sin guardar); pdftable = Open(Get Default Directory() || "test.pdf", PDF All Tables(Combine(all))); // solo algunas de las filas pdftable2 = Open(Get Default Directory() || "test.pdf", PDF Tables(Table(Table Name("test"), Add Rows(Page(1), Rect(0, 0) , 5, 3))))); Cerrar (tabla pdf, sin guardar); Cerrar (pdftable2, sin guardar); Try(Delete File(Get Default Directory() || "test.pdf"));