//#################################################### ################################### //### //### 8. Utilizzo di file e database esterni //### //######################################## ################################################ // In questo file tratteremo: // - Breve riepilogo della sessione 7 (ambito/spazi dei nomi e livello di report) // - .xlsx // - file di testo // - file xml // - file json // - GET Request // - DLL ( Vedi Sessione 5) // - BATCH FILES (Vedi Sessione 5) // - Database (usando il database .sqlite) // - immagini // - pdf //################ #################################################### ############### //### Riepilogo della sessione 7 (proprietà ambito e livello report) //
https://www.jmp.com/support/help/en/ 17.0/#page/jmp/advanced-scoping-and-namespaces.shtml#ww339298 //
https://www.jmp.com/support/help/en/17.0/#page/jmp/best-practices-for-advanced -scripting.shtml# //
https://www.jmp.com/support/help/en/17.0/#page/jmp/show-symbols-clear-symbols-and-delete-symbols.shtml //### #################################################### ############################################################################################################################################################## // L'abilitazione della modalità Names Default To Here associa un ambito chiamato Here con uno script in esecuzione // Non lasciare seguire il codice di produzione in quanto interromperanno altri script Clear Symbols(); Cancella Globali(); Elimina simboli(); Elimina Globali(); // Per vedere quale oggetto messaggi ha puoi usare Show Properties(obj); // Livello report // Per esplorare il livello report usa obj << Show Properties; e obj << Mostra struttura ad albero; (obj << Ottieni XML;) // Ottieni l'accesso al livello del report usando rep = obj << Report; o Report(obj); // Report subscripting (restituisce la prima corrispondenza) param_tratio2 = biv_report[Outline Box("Parameter Estimates"), Number Col Box("t Ratio")]); // Usa obj << Ottieni XML; per vedere come appare XML prima di utilizzare XPath // XPath (restituisce un elenco di corrispondenze E puoi inviare messaggi a un elenco) biv_report << XPath("//OutlineBox[contains(text(), 'Bivariate Normal Ellipse')]" ); //################################################## ################################### //#### //### Lavorare con file esterni // ### //################################################## ###################################### //############ #################################################### #################### //### Promemoria tabella dati JMP (vedi sessione 6) //############## #################################################### ################## dt = Open("$SAMPLE_DATA/Big Class.jmp"); // Invisibile, Privato m_num = dt << get as matrix; nomi = Colonna(dt, "nome") << Ottieni valori; all_vals = dt[0, 0]; // elenco di elenchi dt[0, {"altezza", "peso"}]; // matrice perché le colonne sono numeriche Close(dt, no save); //################################################## ################################## //### File Excel //####### #################################################### ########################## // Apri con interattivo Apri prima per ottenere le impostazioni di base e modificarle secondo necessità // o vedere la sintassi da Scripting Index e hope for best dt = Open( "$SAMPLE_IMPORT_DATA/Team Results.xlsx", Worksheets("Ungrouped Team Results"), Worksheet Settings(Headers Start on Row(3), Data Starts on Row(4)) ); // Salva la tabella dati jmp come cartella di lavoro excel dt = Open("$SAMPLE_DATA/Big Class.jmp", invisible); dt << Salva(Ottieni directory predefinita() || "BigClass.xlsx"); // salva nella stessa directory in cui è salvato questo script // Crea come cartella di lavoro Excel dt2 = Open("$SAMPLE_DATA/Abrasion.jmp", invisible); Crea cartella di lavoro Excel(Ottieni directory predefinita() || "MyWorkbook.xlsx", {dt, dt2}, {"Big", "Abrasive"}); Close(dt, nessun salvataggio); Close(dt2, nessun salvataggio); Apri(Ottieni directory predefinita()); Try(Elimina file(Ottieni directory predefinita() || "BigClass.xlsx")); Try(Elimina file(Ottieni directory predefinita() || "MyWorkbook.xlsx")); //################################################## ################################### //### File di testo //######## #################################################### ########################## txt1 = Carica file di testo("$SAMPLE_IMPORT_DATA/Animals.txt"); txt2 = Carica file di testo("$SAMPLE_IMPORT_DATA/Animals_L.txt"); dt_txt = Apri("$SAMPLE_IMPORT_DATA/Animali_L.txt"); // se i dati sono formattati in modo pulito Open() potrebbe funzionare Salva file di testo(Ottieni directory predefinita() || "example.txt", "line1\!Nline2\!N", mode("replace")); Salva file di testo(Ottieni directory predefinita() || "example.txt", "line3\!Nline4\!N", mode("append")); txt4 = Carica file di testo(Ottieni directory predefinita() || "example.txt"); Try(Elimina file(Ottieni directory predefinita() || "example.txt")); // Per leggere il testo riga per riga, usa Words() con il separatore corretto // Alcuni possibili separatori, \!N, \!r, \!n all_lines = Words(txt2, "\!N"); For Each({line}, all_lines, show(line); //Show(Words(line, "\!t")); ); // Alcuni trucchi aprendo come script e usando ScriptBox my_scriptwindow = Open("$SAMPLE_IMPORT_DATA/Animals_L.txt", "script"); my_scriptwindow << Mostra finestra(0); myfile_lines = my_scriptwindow[scriptBox(1)] << getLines(); my_scriptwindow << chiudi finestra; aspetta(0); show(all_lines, myscript_lines); txt3_line3 = Carica file di testo("$SAMPLE_IMPORT_DATA/Animals_line3.txt"); // i dati iniziano alla riga 3 // A seconda di ciò che si desidera fare, è possibile rimuovere le righe non necessarie (1 e 2) lines = Words(txt3_line3, "\!N"); // fai attenzione con Words() poiché combinerà i separatori Remove From(lines, 1, 1); // e poi salvalo, riapri o costruisci la tabella eseguendo un ciclo o semplicemente Apri con Blob // Avanzato... puoi usare Blob con Apri. C'è una spiegazione da qualche parte nella community di
@Craige_Hales dt = Open(Char To Blob(Concat Items(lines, "\!N")), "text"); //"testo" deve essere qui //########################################## ########################################### //### File XML / /#################################################### ################################## // L'ho usato molto raramente, ma questo script può dare un'idea / / Analizza XML, XML Attr e XML Text file_contents = Carica file di testo("$SAMPLE_IMPORT_DATA/BigclassExcel.xml"); Parse XML(file_contents, OnElement( "Worksheet", StartTag( sheetname = XML Attr("Name"); show(sheetname); dt = New Table(sheetname); row = 1; col = 1; ) ), OnElement( " Row", StartTag( If(row > 1, // presuppone che la prima riga sia i nomi delle colonne 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)), // assume che la prima riga abbia nomi di colonna Column(col)[row - 1] = data// e altre righe hanno dati ); ) ) ); // Apri con esportazione XML fatta con interattivo. Potrebbero essere dei modi per farlo funzionare dt = Open( "$SAMPLE_IMPORT_DATA/BigclassExcel.xml", XML Settings( Stack(0), Row("/Workbook/Worksheet/Table/Row/Cell/Data"), Col( "/ Cartella di lavoro/Foglio di lavoro/Tabella/Riga/Cella/Dati", Nome colonna("Dati"), Riempimento("Usa una volta"), Tipo("Carattere"), Formato({"Migliore"}), Tipo modellazione("Continuo ") ) ), XML Wizard(1) // XML Wizard(0) per disabilitare ui ); //################################################## ################################### //### DLL e file batch (vedere Sessione 5 (Carica DLL ed Esegui programma()) //############################################## ############################################ // DLL // Vedi https:// docs.microsoft.com/en-us/windows/win32/api/ F_getScreenSize = Function({}, {Default Local}, securDll = Carica DLL("user32.dll", autoDeclare(false)); securDll << DeclareFunction( "GetSystemMetrics", Arg(Int32), return(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(); // File batch (.bat) // Una breve nota sui file batch // - Nessuno spazio finale // - Deve aggiungere un 'NewLine' mybat_string = " echo off \!n cls \!n echo Hello World \!n echo L'ora è " || Char(MDYHMS(Today())) || " \!n "; mybat_path = Ottieni la directory predefinita () || "testbatch.bat"; Salva file di testo(mybat_path, mybat_string, Mode("replace")); // Se abbiamo bisogno di restituire il risultato, puoi usare Run Program bat_path = Convert File Path(mybat_path, windows); rp1 = Esegui programma( Executable(bat_path), ReadFunction("text") ); Mostra(La directory esiste("C:\SCRIPTERSCLUBTEST")); mybat_string2 = "\[mkdir "C:\SCRIPTERSCLUBTEST\" \!n]\"; mybat_path = Ottieni la directory predefinita() || "batch di prova.bat"; mybat_path = Converti percorso file(mybat_path, windows); Salva file di testo(mybat_path, mybat_string2, Mode("replace")); Apri(mybat_path); // questo eseguirà il bat Show(Directory Exists("C:\SCRIPTERSCLUBTEST")); aspetta(3); // bisognerà attendere Show(Directory Exists("C:\SCRIPTERSCLUBTEST")); // Oppure usa DLL Try(Delete Directory("C:\SCRIPTERSCLUBTEST")); aspetta(0); Mostra(La directory esiste("C:\SCRIPTERSCLUBTEST")); kernel32 = CaricaDLL("Kernel32"); kernel32 << DeclareFunction( "WinExec", Convention(STDCALL), Alias("WinExec"), Arg(AnsiString, "lpCmdLine"), Arg(Int32, "uCmdShow"), Returns(Int32) ); kernel32 << WinExec(mybat_path, 5); Mostra(La directory esiste("C:\SCRIPTERSCLUBTEST")); aspetta(3); // dovremo aspettare. Il tempo dipende da .bat corse Show(Directory Exists("C:\SCRIPTERSCLUBTEST")); Prova (Elimina file (mybat_path)); Try(Elimina directory("C:\Users\SCRIPTERSCLUBTEST")); //################################################## ################################### //#### File JSON //### ce ne sono molti diversi funzioni, ricerca nell'indice di scripting per "JSON" //############################################ ###################################################################### json1 = Carica file di testo (Get Directory predefinita() ||"Big Class_column.json", "JSON"); // array associativo json2 = Carica file di testo(Ottieni directory predefinita() ||"Big Class_row.json"); // stringa // Analizza JSON(json2); // Utilizzo dell'apertura interattiva con anteprima dt = Open( "/H:/JSL Course/session 8/Big Class_row.json", Impostazioni JSON( Stack(0), Row("/root"), Col("/root/ name", Nome colonna("name"), Fill("Use Once"), Type("Character"), Format({"Best"}), Modeling Type("Continuous")), Col("/root/ age", Nome colonna("age"), Fill("Use Once"), Type("Numeric"), Format({"Best"}), Modeling Type("Continuous")), Col("/root/ sex", Nome colonna("sex"), Fill("Use Once"), Type("Character"), Format({"Best"}), Modeling Type("Continuous")), Col("/root/ height", Nome colonna("height"), Fill("Use Once"), Type("Numeric"), Format({"Best"}), Modeling Type("Continuous")), Col("/root/ weight", Nome colonna("weight"), Fill("Use Once"), Type("Numeric"), Format({"Best"}), Modeling Type("Continuous")) ), JSON Wizard(0) ); // Se JSON è un formato facile da usare per JMP, solo Open potrebbe funzionare dt2 = Open(Get Default Directory() ||"Big Class_row.json"); // A volte potrebbe essere utile usare il trucco Open(Blob()) dt3 = Open(Char To Blob(json2), "json"); // apre il testo nella tabella Try(Close(dt, no save)); Try(Close(dt2, no save)); Try(Close(dt3, no save)); // Da JSON ad AA e da AA a JSON my_json_str = "{ \!"myChar\!": \!"Valore carattere\!", \!"myNum\!": 12345}"; aa_json = Analizza JSON(my_json_str); json_str = As JSON Expr(aa_json); // torna a JSON // aa_json2 = Analizza JSON(json_str); //############ #################################################### #################### //### Richieste HTTP (GET) //################## #################################################### ############## // può essere utilizzato per testare richieste semplici
https://httpbin.org/ request = New HTTP Request( URL("
https://httpbin.org//get "), Method("GET"), Timeout(5) // il valore predefinito è 60. Suggerisco di modificarlo secondo necessità ea seconda del server ); dati = richiesta << Invia; // Vedi l'indice di scripting per altri messaggi relativi a New HTTP Request // request << Get Last URL; // richiesta << Ottieni stato; aa_json = Analizza JSON(dati); //################################################## ################################### //#### Lavorare con i database (sqlite select) // https: //community.jmp.com/t5/Discussions/Which-way-to-go-query-database/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# //######## #################################################### ######################### // Il formato generale (a mia conoscenza) per la stringa di connessione è // connection_str ="DSN=MYDSN_NAME;UID=USERNAME; PWD=PASSWORD"; // dsn_string = "Driver={ODBC DRIVER};Dbq=DBDSNNAME;UID=DBUSERNAME;PWD=DBPASSWORD;"; (la parte del driver non è sempre necessaria) // Quando viene utilizzata la nuova query SQL, è necessario prefissare ODBC: //dsn_string = "ODBC:Driver={ODBC DRIVER};Dbq=DBDSNNAME;UID=DBUSERNAME;PWD=DBPASSWORD; "; // Se sei in grado di creare una query utilizzando il Generatore di query di JMP nel tuo database, puoi ottenere la stringa di connessione da lì // potrebbe contenere molte più informazioni ma molto probabilmente puoi semplificarla // QUESTE SONO DIPENDENTI DAL TUO DATABASE // Il dipartimento IT potrebbe essere in grado di aiutare con questi //
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- Using-a-Connection-String // Fai anche attenzione quando condividi tabelle che hanno script di tabella creati dalla query del database poiché potrebbero contenere password // Nascondi la preferenza della stringa di connessione ODBC potrebbe essere d'aiuto (
https://community.jmp.com/ t5/JMP-Knowledge-Base/Database-table-scripts-Update-from-Database-Modify-etc-or/ta-p/621050) sqlite_path = Ottieni la directory predefinita() || "QCdata.sqlite"; connection_str = Eval Insert("SQLite:Database=^sqlite_path^"); sql_str = "seleziona * dal lotto"; // Apri database dt = Apri database(connection_Str, sql_str, "NewTable"); // Crea connessione database, Esegui SQL, Chiudi connessione database dbc = Crea connessione database(connection_str); dt = Esegui SQL(dbc, sql_str, "NewTable"); Chiudi connessione al database (dbc); // Nuova query SQL (per quanto ne so questo è il metodo preferito) sql_obj = Nuova query SQL(Connection(connection_str), Custom SQL(sql_str)); dt = sql_obj << Esegui; // utilizza le preferenze jmp degli utenti dt = sql_obj << Esegui in background; // Farà funzionare JMP dt = sql_obj << Run Foreground; // Bloccherà l'esecuzione di JMP fino al termine della query // È possibile impostare gli script OnRunComplete su New SQL Query (vedere l'indice di scripting) sql_obj << Run Foreground(OnRunComplete(Write("Numero di righe nel risultato della query: ", N Rows(queryResult) ))); // non verrà stampato sul registro incorporato // Ci sono anche OnRunCanceled e OnError // Pochi "suggerimenti" SQL // Usa il pattern connection_str e sql_template (potresti persino salvarli in semplici file .jsl) dsn_string = Eval Insert("SQLite: Database=^sqlite_path^"); sql_template = "\[select * from lot where lot in (¤lotnr¤)]\"; lotnr = "'API00017'"; sql_str = Eval Insert(sql_template, "¤"); // inserisci i valori nel tuo template sql_obj = New SQL Query(Connection(dsn_string), Custom SQL(sql_str)); dt = sql_obj << Esegui in primo piano; lotnr = "'API00017', 'API00058'"; sql_str = Eval Insert(sql_template, "¤"); sql_obj = Nuova query SQL(Connessione(dsn_string), SQL personalizzato(sql_str)); dt = sql_obj << Esegui in primo piano; // Se le query del database non generano errori e puoi provare a utilizzare Log Capture() per acquisire problemi sql_error = Log Capture(dt = Open Database(connection_Str, sql_str, "NewTable")); mostra(errore_sql); If(Contains(sql_error, "[ODBC Driver Manager]"), Throw(sql_error); ); // Potrebbe essere una buona idea controllare se dt è vuoto o non ha righe Is Empty(dt10); N Righe(dt); // questo genererà un errore se dt non esiste // Usa Query per eseguire query SQL con tabelle di dati OPEN JMP dt = Open("$SAMPLE_DATA/Big Class.jmp", Invisible); dt_result = Query(dt, "SELECT nome, età, altezza FROM 'Classe grande' WHERE età > 14;" ); // Utilizzo di alias, esecuzione di un join 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."College Degrees", t2."Eighth Grade Math " FROM t1 LEFT OUTER JOIN t2 ON t1.State = t2.State WHERE t1.'SAT Math' > 550; ]\" ); // Query che restituisce un valore scalare retval1 = Query(Scalar, dt, "SELECT AVG(height) from 'Big Class';"); // Query senza tabelle retval2 = Query(Scalar, "SELECT SQRT(152399025);"); // potrebbe essere fatto senza sql, ma è bene avere options avg_height = Col Mean(Column(dt, "height")); sqrt_val = Sqrt(152399025); // funzioni disponibili
https://www.jmp.com/support/help/en/16.2/#page/jmp/sql-functions-available-for-jmp-queries.shtml#ww998370 // Ci sono attività che a volte sono più facile da eseguire con SQL (se puoi scrivere la query) che con JMP dt = Open("$SAMPLE_DATA/Big Class.jmp", Invisible); // un esempio potrebbe essere la concatenazione di valori in una singola colonna per gruppo // Questo può essere utile prima del riepilogo o della divisione, ad esempio per evitare di perdere dati dt_result = Query(dt, "\[SELECT age, group_concat(name, ', ') nomi DA 'Classe Grande' GRUPPO PER età ]\" ); //################################################## ################################### //#### file zip (indice di scripting per altro) // https
https://www.jmp.com/support/help/en/16.2/#page/jmp/zip-archives.shtml?os=win&source=application#1931138 //############## #################################################### ################## za = Apri(Ottieni directory predefinita() || "cartella1.zip", zip); // apri come oggetto archivio zip dirlist = za << dir; // restituisce l'elenco dei membri nell'elenco za << Write("newfile.txt", "this is newfiledata"); // scrive un nuovo file dirlist = za << dir; // testo = za << Read(dirlist[2]); // leggi dall'archivio zip // Comprimi la cartella in un file Zip (
@Justin_Chilton) //
https://community.jmp.com/t5/JSL-Cookbook-Archived/Compress-a-Folder-into-a-Zip- File/ta-p/48878 //############################################## ################################################ Importazione di più file ( MFI) //
https://www.jmp.com/support/help/en/16.2/#page/jmp/utility-functions.shtml?os=win&source=application#ww7168938 //### Può essere utile quando avere più file .csv dall'aspetto simile, ad esempio //### Provalo prima con l'interattività e poi copia lo script //### Puoi anche ottenere un elenco di file usando Files In Directory() e scorrendoci sopra ma //# ## MFI ha funzionalità aggiuntive //############################################ ################################################################################################################################################ ("$SAMPLE_IMPORT_DATA"), <, Add Rows(Page(n),
, Rect(top, left, right, bottom), , ), ...)) | PDF Tutte le tabelle(< Combina(Tutte | Intestazioni corrispondenti | Nessuna)>, , ) | Testo PDF (, ) | Creazione guidata PDF );*/ dt = Open("$SAMPLE_DATA\Big Class.jmp"); w = Nuova finestra("test", Data Table Box(dt)); w << salva immagine(Ottieni directory predefinita() || "test.pdf", pdf); w << chiudi finestra; close(dt, nessun salvataggio); pdftable = Open(Ottieni directory predefinita() || "test.pdf", PDF Tutte le tabelle(Combina(tutte))); // solo alcune delle righe pdftable2 = Open(Get Default Directory() || "test.pdf", PDF Tables(Table(Table Name("test"), Add Rows(Page(1), Rect(0, 0 , 5, 3))))); Close(pdftable, no save); Close(pdftable2, no save); Try(Elimina file(Ottieni directory predefinita() || "test.pdf"));