//############################################# ################################# //### //### 8. Arbeiten mit externen Dateien und Datenbanken //### //################################## ############################################ // In dieser Datei Wir werden Folgendes behandeln: // - Kurze Zusammenfassung von Sitzung 7 (Bereich/Namespaces und Berichtsebene) // - .xlsx // - Textdateien // - XML-Dateien // - JSON-Dateien // - GET Request // - DLL ( Siehe Sitzung 5) // - BATCH-DATEIEN (Siehe Sitzung 5) // - Datenbanken (unter Verwendung der .sqlite-Datenbank) // - Bilder // - pdf //################ ############################################### ################ //### Zusammenfassung von Sitzung 7 (Bereichseigenschaften und Berichtsebene) //
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 //### ############################################### ############################# // Geltungsbereich und Namespaces // Starten Sie Ihre Skripte mit Names Default To Here(1); // Durch Aktivieren des Modus „Namen standardmäßig hierher“ wird ein Bereich namens „Hier“ mit einem ausgeführten Skript verknüpft. // Überlassen Sie das Folgende nicht dem Produktionscode, da dadurch andere Skripte beschädigt werden. Clear Symbols(); Clear Globals(); Symbole löschen(); Globals(); löschen // Um zu sehen, welches Nachrichtenobjekt vorhanden ist, können Sie Show Properties(obj) verwenden. // Berichtsebene // Um die Berichtsebene zu erkunden, verwenden Sie obj << Show Properties; und obj << Baumstruktur anzeigen; (obj << Get XML;) // Zugriff auf die Berichtsebene erhalten mit rep = obj << Report; oder Report(obj); // Subskribierung des Berichts (gibt die erste Übereinstimmung zurück) param_tratio2 = biv_report[Outline Box("Parameter Estimates"), Number Col Box("t Ratio")]; // Verwenden Sie obj << Get XML; um zu sehen, wie XML vor der Verwendung von XPath aussieht // XPath (gibt eine Liste von Übereinstimmungen zurück UND Sie können Nachrichten an eine Liste senden) biv_report << XPath("//OutlineBox[contains(text(), 'Bivariate Normal Ellipse')]" ); //############################################# ################################# //### //### Arbeiten mit externen Dateien // ### //######################################### #################################### //########### ############################################### ################### //### Erinnerungen an JMP-Datentabellen (siehe Sitzung 6) //############# ############################################### ################### dt = Open("$SAMPLE_DATA/Big Class.jmp"); // Unsichtbar, privat m_num = dt << get as matrix; Namen = Spalte(dt, „Name“) << Werte abrufen; all_vals = dt[0, 0]; // Liste der Listen dt[0, {"height", "weight"}]; // Matrix, da die Spalten numerisch sind Close(dt, no save); //############################################# ################################## //### Excel-Datei //####### ############################################### ######################### // Mit interaktivem Öffnen öffnen. Zuerst öffnen, um Grundeinstellungen zu erhalten und nach Bedarf zu ändern // oder sehen Sie sich die Syntax im Skriptindex an und hoffe auf das Beste dt = Open( "$SAMPLE_IMPORT_DATA/Team Results.xlsx", Worksheets("Ungrouped Team Results"), Worksheet Settings(Headers Start on Row(3), Data Starts on Row(4)) ); // JMP-Datentabelle als Excel-Arbeitsmappe speichern dt = Open("$SAMPLE_DATA/Big Class.jmp", unsichtbar); dt << Save(Get Default Directory() || "BigClass.xlsx"); // im selben Verzeichnis speichern, in dem dieses Skript gespeichert ist // Als Excel-Arbeitsmappe erstellen dt2 = Open("$SAMPLE_DATA/Abrasion.jmp", unsichtbar); Excel-Arbeitsmappe erstellen (Get Default Directory() || "MyWorkbook.xlsx", {dt, dt2}, {"Big", "Abrasive"}); Close(dt, kein Speichern); Close(dt2, kein Speichern); Open(Standardverzeichnis abrufen()); Try(Delete File(Get Default Directory() || "BigClass.xlsx")); Try(Delete File(Get Default Directory() || "MyWorkbook.xlsx")); //############################################# ################################# //### Textdateien //####### ############################################### ######################### txt1 = Textdatei laden("$SAMPLE_IMPORT_DATA/Animals.txt"); txt2 = Textdatei laden("$SAMPLE_IMPORT_DATA/Animals_L.txt"); dt_txt = Open("$SAMPLE_IMPORT_DATA/Animals_L.txt"); // wenn die Daten sauber formatiert sind, könnte Open() funktionieren Save Text File(Get Default Directory() || "example.txt", "line1\!Nline2\!N", mode("replace")); Textdatei speichern(Get Default Directory() || "example.txt", "line3\!Nline4\!N", mode("append")); txt4 = Textdatei laden (Standardverzeichnis abrufen() || "example.txt"); Try(Delete File(Get Default Directory() || "example.txt")); // Um Text Zeile für Zeile zu lesen, verwenden Sie Words() mit korrektem Trennzeichen // Einige mögliche Trennzeichen, \!N, \!r, \!n all_lines = Words(txt2, "\!N"); For Each({line}, all_lines, show(line); //Show(Words(line, "\!t")); ); // Einige Tricks beim Öffnen als Skript und Verwenden von ScriptBox my_scriptwindow = Open("$SAMPLE_IMPORT_DATA/Animals_L.txt", "script"); my_scriptwindow << Show Window(0); myfile_lines = my_scriptwindow[scriptBox(1)] << getLines(); my_scriptwindow << Fenster schließen; warte(0); show(all_lines, myscript_lines); txt3_line3 = Textdatei laden("$SAMPLE_IMPORT_DATA/Animals_line3.txt"); // Daten beginnen in Zeile 3 // Je nachdem, was Sie tun möchten, können Sie unnötige Zeilen (1 und 2) entfernen. Zeilen = Words(txt3_line3, "\!N"); // Seien Sie vorsichtig mit Words(), da es Trennzeichen kombiniert. Remove From(lines, 1, 1); // und dann speichern, erneut öffnen oder Tabelle durch Schleifen erstellen oder einfach mit Blob öffnen // Erweitert ... Sie können Blob mit Öffnen verwenden. Irgendwo in der Community gibt es eine Erklärung von
@Craige_Hales dt = Open(Char To Blob(Concat Items(lines, "\!N")), "text"); //„Text“ muss hier sein //##################################### ######################################## //### XML-Dateien / /############################################## ################################ // Ich habe das sehr selten verwendet, aber dieses Skript kann eine Idee geben / / XML, XML Attr und XML Text analysieren file_contents = Textdatei laden("$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, // davon ausgehen, dass die erste Zeile Spaltennamen enthält 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)), // davon ausgehen, dass die erste Zeile Spaltennamen hat Column(col)[row - 1] = Daten// und andere Zeilen haben Daten ); ) ) ); // Mit interaktivem XML-Export öffnen. Möglicherweise gibt es Möglichkeiten, dies zum Laufen zu bringen dt = Open( "$SAMPLE_IMPORT_DATA/BigclassExcel.xml", XML Settings( Stack(0), Row("/Workbook/Worksheet/Table/Row/Cell/Data"), Col( "/ Arbeitsmappe/Arbeitsblatt/Tabelle/Zeile/Zelle/Daten“, Spaltenname („Daten“), Füllung („Einmal verwenden“), Typ („Zeichen“), Format („Best“}), Modellierungstyp („Kontinuierlich“) ") ) ), XML Wizard(1) // XML Wizard(0) zum Deaktivieren der Benutzeroberfläche); //############################################# ################################# //### DLL- und Batch-Dateien (siehe Sitzung 5 (DLL laden). und Programm ausführen()) //###################################### ####################################### // DLL // Siehe https:// docs.microsoft.com/en-us/windows/win32/api/ F_getScreenSize = Function({}, {Default Local}, securDll = Load DLL("user32.dll", autoDeclare(false)); securDll << DeclareFunction( „GetSystemMetrics“, Arg(Int32), returns(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(); // Batch-Datei (.bat) // Eine kurze Anmerkung zu Batch-Dateien // - Keine Leerzeichen am Ende // - Muss hinzugefügt werden 'NewLine' mybat_string = " echo off \!n cls \!n echo Hello World \!n echo The time is " || Char(MDYHMS(Today())) || " \!n "; mybat_path = Get Default Directory () || "testbatch.bat"; Save Text File(mybat_path, mybat_string, Mode("replace")); // Wenn wir ein Rückgabeergebnis benötigen, können Sie Run Program verwenden bat_path = Convert File Path(mybat_path, windows); rp1 = Programm ausführen( Executable(bat_path), ReadFunction("text") ); Show(Directory Exists("C:\SCRIPTERSCLUBTEST")); mybat_string2 = "\[mkdir "C:\SCRIPTERSCLUBTEST\" \!n]\"; mybat_path = Standardverzeichnis abrufen() || "testbatch.bat"; mybat_path = Dateipfad konvertieren(mybat_path, windows); Textdatei speichern(mybat_path, mybat_string2, Mode("replace")); Open(mybat_path); // Dadurch wird der Bat ausgeführt Show(Directory Exists("C:\SCRIPTERSCLUBTEST")); warte(3); // wir müssen warten Show(Directory Exists("C:\SCRIPTERSCLUBTEST")); // Oder DLL verwenden Try(Delete Directory("C:\SCRIPTERSCLUBTEST")); warte(0); Show(Directory Exists("C:\SCRIPTERSCLUBTEST")); kernel32 = LoadDLL("Kernel32"); kernel32 << DeclareFunction( "WinExec", Convention(STDCALL), Alias("WinExec"), Arg(AnsiString, "lpCmdLine"), Arg(Int32, "uCmdShow"), Returns(Int32) ); kernel32 << WinExec(mybat_path, 5); Show(Directory Exists("C:\SCRIPTERSCLUBTEST")); warte(3); // wir müssen warten. Die Zeit hängt davon ab, wie .bat ausgeführt wurde. Show(Directory Exists("C:\SCRIPTERSCLUBTEST")); Try(Delete File(mybat_path)); Try(Delete Directory("C:\Users\SCRIPTERSCLUBTEST")); //############################################# ################################# //### JSON-Dateien //### Es gibt viele verschiedene Funktionen, Skriptindex nach „JSON“ durchsuchen //#################################### ######################################### json1 = Textdatei laden (Get Standardverzeichnis() ||"Big Class_column.json", "JSON"); // assoziatives Array json2 = Load Text File(Get Default Directory() ||"Big Class_row.json"); // string // JSON(json2) analysieren; // Interaktives Öffnen mit Vorschau verwenden dt = Open( "/H:/JSL Course/session 8/Big Class_row.json", JSON Settings( Stack(0), Row("/root"), Col("/root/ name", Column Name("name"), Fill("Use Once"), Type("Character"), Format({"Best"}), Modeling Type("Continuous")), Col("/root/ age", Spaltenname("age"), Fill("Use Once"), Type("Numeric"), Format({"Best"}), Modeling Type("Continuous")), Col("/root/ sex", Spaltenname("sex"), Fill("Use Once"), Type("Character"), Format({"Best"}), Modeling Type("Continuous")), Col("/root/ height", Spaltenname("height"), Fill("Use Once"), Type("Numeric"), Format({"Best"}), Modeling Type("Continuous")), Col("/root/ Gewicht“, Spaltenname („Gewicht“), Füllung („Einmal verwenden“), Typ („Numerisch“), Format („Best“}), Modellierungstyp („Kontinuierlich“)), JSON-Assistent (0) ); // Wenn das JSON-Format einfach für JMP zu verwenden ist, funktioniert möglicherweise nur „Öffnen“ dt2 = Open(Get Default Directory() ||"Big Class_row.json"); // Manchmal kann es nützlich sein, den Open(Blob())-Trick zu verwenden dt3 = Open(Char To Blob(json2), "json"); // Text in Tabelle öffnen Try(Close(dt, no save)); Try(Close(dt2, no save)); Try(Close(dt3, no save)); // JSON zu AA und AA zu JSON my_json_str = "{ \!"myChar\!": \!"Zeichenwert\!", \!"meineNum\!": 12345}"; aa_json = Parse JSON(my_json_str); json_str = As JSON Expr(aa_json); // zurück zu JSON // aa_json2 = Parse JSON(json_str); //############ ############################################### ################### //### HTTP-Anfragen (GET) //################# ############################################### ############## // kann zum Testen einfacher Anfragen verwendet werden
https://httpbin.org/ request = New HTTP Request( URL("
https://httpbin.org//get "), Method("GET"), Timeout(5) // Standard ist 60. Ich schlage vor, es je nach Bedarf und Server zu ändern. data = request << Send; // Siehe Skriptindex für weitere Meldungen im Zusammenhang mit New HTTP Request // request << Get Last URL; // request << Get Status; aa_json = JSON(Daten) analysieren; //############################################# ################################# //### Arbeiten mit Datenbanken (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# //######## ############################################### ######################## // Das allgemeine Format (meines Wissens) für die Verbindungszeichenfolge ist // Connection_str ="DSN=MYDSN_NAME;UID=USERNAME; PWD=PASSWORT"; // dsn_string = "Driver={ODBC DRIVER};Dbq=DBDSNNAME;UID=DBUSERNAME;PWD=DBPASSWORD;"; (Treiberteil wird nicht immer benötigt) // Wenn eine neue SQL-Abfrage verwendet wird, müssen Sie ODBC voranstellen: //dsn_string = "ODBC:Driver={ODBC DRIVER};Dbq=DBDSNNAME;UID=DBUSERNAME;PWD=DBPASSWORD; "; // Wenn Sie mit dem Query Builder von JMP eine Abfrage für Ihre Datenbank erstellen können, können Sie die Verbindungszeichenfolge von dort abrufen // sie enthält möglicherweise viel mehr Informationen, aber Sie können sie höchstwahrscheinlich vereinfachen // DIESE SIND VON IHRER DATENBANK ABHÄNGIG // Die IT-Abteilung kann möglicherweise dabei helfen //
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 // Seien Sie auch vorsichtig, wenn Sie Tabellen freigeben, die über durch Datenbankabfragen erstellte Tabellenskripte verfügen, da diese möglicherweise Passwörter enthalten. // Die Einstellung „ODBC-Verbindungszeichenfolge ausblenden“ kann dabei hilfreich sein (
https://community.jmp.com/ t5/JMP-Knowledge-Base/Database-table-scripts-Update-from-Database-Modify-etc-or/ta-p/621050) sqlite_path = Get Default Directory() || „QCdata.sqlite“; Connection_str = Eval Insert("SQLite:Database=^sqlite_path^"); sql_str = "select * from lot"; // Datenbank öffnen dt = Open Database(connection_Str, sql_str, "NewTable"); // Datenbankverbindung erstellen, SQL ausführen, Datenbankverbindung schließen dbc = Datenbankverbindung erstellen(connection_str); dt = Execute SQL(dbc, sql_str, "NewTable"); Datenbankverbindung schließen (dbc); // Neue SQL-Abfrage (meines Wissens ist dies die bevorzugte Methode) sql_obj = New SQL Query(Connection(connection_str), Custom SQL(sql_str)); dt = sql_obj << Run; // verwendet die JMP-Einstellungen des Benutzers dt = sql_obj << Run Background; // Lässt JMP arbeiten dt = sql_obj << Run Foreground; // Blockiert die JMP-Ausführung, bis die Abfrage abgeschlossen ist // Sie können OnRunComplete-Skripte auf „Neue SQL-Abfrage“ setzen (siehe Skriptindex) sql_obj << Run Foreground(OnRunComplete(Write("Anzahl der Zeilen im Abfrageergebnis: ", N Rows(queryResult) ))); // wird nicht in das eingebettete Protokoll gedruckt // Es gibt auch OnRunCanceled und OnError // Einige SQL-„Tipps“ // Verwenden Sie die Muster „connection_str“ und „sql_template“ (Sie können diese sogar in einfachen .jsl-Dateien speichern) dsn_string = Eval Insert("SQLite: Datenbank=^sqlite_path^"); sql_template = "\[select * from lot where lot in (¤lotnr¤)]\"; lotnr = "'API00017'"; sql_str = Eval Insert(sql_template, "¤"); // Werte in Ihre Vorlage einfügen sql_obj = New SQL Query(Connection(dsn_string), Custom SQL(sql_str)); dt = sql_obj << Run Foreground; lotnr = "'API00017', 'API00058'"; sql_str = Eval Insert(sql_template, "¤"); sql_obj = Neue SQL-Abfrage (Verbindung (dsn_string), benutzerdefiniertes SQL (sql_str)); dt = sql_obj << Run Foreground; // Wenn Datenbankabfragen keine Fehler auslösen und Sie versuchen können, Log Capture() zum Erfassen von Problemen zu verwenden, sql_error = Log Capture(dt = Open Database(connection_Str, sql_str, "NewTable")); show(sql_error); If(Contains(sql_error, "[ODBC Driver Manager]"), Throw(sql_error); ); // Es könnte eine gute Idee sein, zu prüfen, ob dt leer ist oder keine Zeilen hat. Is Empty(dt10); N Zeilen(dt); // Dies führt zu einem Fehler, wenn dt nicht vorhanden ist. // Verwenden Sie Query, um SQL-Abfragen mit OPEN JMP-Datentabellen durchzuführen. dt = Open("$SAMPLE_DATA/Big Class.jmp", Invisible); dt_result = Query(dt, "SELECT name, age, height FROM 'Big Class' WHERE age > 14;" ); // Mit Aliasen einen Join durchführen 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; ]\" ); // Abfrage, die einen Skalarwert zurückgibt retval1 = Query(Scalar, dt, "SELECT AVG(height) from 'Big Class';"); // Abfrage ohne Tabellen retval2 = Query(Scalar, "SELECT SQRT(152399025);"); // könnte ohne SQL gemacht werden, aber es ist gut, Optionen zu haben avg_height = Col Mean(Column(dt, "height")); sqrt_val = Sqrt(152399025); // verfügbare Funktionen
https://www.jmp.com/support/help/en/16.2/#page/jmp/sql-functions-available-for-jmp-queries.shtml#ww998370 // Es gibt Aufgaben, die manchmal sind einfacher mit SQL durchzuführen (wenn Sie die Abfrage schreiben können) als mit JMP dt = Open("$SAMPLE_DATA/Big Class.jmp", Invisible); // Ein Beispiel könnte die Verkettung von Werten zu einer einzelnen Spalte nach Gruppe sein. // Dies kann vor der Zusammenfassung oder Aufteilung hilfreich sein, um beispielsweise Datenverluste zu vermeiden. dt_result = Query(dt, "\[SELECT age, group_concat(name, ', ') Namen AUS „Große Klasse“ GRUPPE NACH Alter ]\" ); //############################################# ################################# //### ZIP-Dateien (Skriptindex für mehr) // https

/
www.jmp.com/support/help/en/16.2/#page/jmp/zip-archives.shtml?os=win&source=application#1931138 //############# ############################################### ################## za = Open(Get Default Directory() || "folder1.zip", zip); // Als Zip-Archivobjekt öffnen dirlist = za << dir; // gibt eine Liste der Mitglieder in der Liste zurück za << Write("newfile.txt", "this is newfiledata"); // Neue Datei schreiben dirlist = za << dir; // text = za << Read(dirlist[2]); // aus Zip-Archiv lesen // Ordner in eine Zip-Datei komprimieren (
@Justin_Chilton) //
https://community.jmp.com/t5/JSL-Cookbook-Archived/Compress-a-Folder-into-a-Zip- Datei/ta-p/48878 //###################################### ####################################### //### Mehrere Dateiimport ( MFI) //
https://www.jmp.com/support/help/en/16.2/#page/jmp/utility-functions.shtml?os=win&source=application#ww7168938 //### Kann hilfreich sein, wenn Sie haben zum Beispiel mehrere ähnlich aussehende CSV-Dateien //### Probieren Sie es zuerst interaktiv aus und kopieren Sie dann das Skript //### Sie können eine Liste der Dateien auch mit Files In Directory() erhalten und diese durchlaufen, aber //# ## MFI verfügt über zusätzliche Funktionen //######################################## ####################################### mfi = Mehrere Dateiimport( <, Add Rows(Page(n),
, Rect(top, left, right, bottom), , ), ...)) | PDF All Tables(< Combine(All | Matching Headers | None)>, , ) | PDF Text (, ) | PDF Wizard );*/ dt = Open("$SAMPLE_DATA\Big Class.jmp"); w = Neues Fenster("test", Datentabellenbox(dt)); w << Bild speichern(Get Default Directory() || "test.pdf", pdf); w << Fenster schließen; close(dt, no save); pdftable = Open(Get Default Directory() || "test.pdf", PDF All Tables(Combine(all))); // nur einige der Zeilen 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(Delete File(Get Default Directory() || "test.pdf"));