//############################################### ################################## //### //### 8. Travailler avec des fichiers et des bases de données externes //### //#################################### ############################################# // Dans ce fichier nous couvrirons : // - Court récapitulatif de la session 7 (portée/espaces de noms et couche de rapport) // - .xlsx // - fichiers texte // - fichiers xml // - fichiers json // - GET Request // - DLL ( Voir Session 5) // - FICHIERS BATCH (Voir Session 5) // - Bases de données (utilisant la base de données .sqlite) // - images // - pdf //################# ################################################# ################ //### Récapitulatif de la session 7 (Propriétés de la portée et couche de rapport) //
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 //### ################################################# ############################# // Portée et espaces de noms // Démarrez vos scripts avec Names Default To Here(1); // L'activation du mode Names Default To Here associe une portée appelée Here à un script en cours d'exécution // Ne laissez pas la suite au code de production car elle cassera d'autres scripts Clear Symbols(); Effacer Globals(); Supprimer les symboles(); Supprimer Globals(); // Pour voir quel objet de messages contient, vous pouvez utiliser Show Properties(obj); // Couche de rapport // Pour explorer la couche de rapport, utilisez obj << Afficher les propriétés ; et obj << Afficher l'arborescence ; (obj << Get XML;) // Accéder à la couche de rapport en utilisant rep = obj << Report; ou Report(obj); // Rapporter l'indice (renvoie la première correspondance) param_tratio2 = biv_report[Outline Box("Parameter Estimates"), Number Col Box("t Ratio")] ; // Utiliser obj << Obtenir XML ; pour voir à quoi ressemble XML avant d'utiliser XPath // XPath (renvoie une liste de correspondances ET vous pouvez envoyer des messages à une liste) biv_report << XPath("//OutlineBox[contains(text(), 'Bivariate Normal Ellipse')]" ); //############################################### ################################## //### //### Travailler avec des fichiers externes // ### //############################################ ##################################### //########### ################################################# ##################### //### Rappels du tableau de données JMP (voir session 6) //############# ################################################# ################### dt = Ouvrir("$SAMPLE_DATA/Big Class.jmp"); // Invisible, Private m_num = dt << get as matrix ; noms = Colonne(dt, "nom") << Obtenir les valeurs ; all_vals = dt[0, 0] ; // liste de listes dt[0, {"taille", "poids"}] ; // matrice car les colonnes sont numériques Close(dt, no save); //############################################### ################################## //### Fichier Excel //####### ################################################# ######################### // Ouvrir avec l'ouverture interactive d'abord pour obtenir les paramètres de base et les modifier si nécessaire // ou voir la syntaxe de Scripting Index et espérons le meilleur dt = Open( "$SAMPLE_IMPORT_DATA/Team Results.xlsx", Worksheets("Ungrouped Team Results"), Worksheet Settings(Headers Start on Row(3), Data Starts on Row(4)) ); // Enregistrer la table de données jmp en tant que classeur Excel dt = Open("$SAMPLE_DATA/Big Class.jmp", invisible); dt << Enregistrer (Obtenir le répertoire par défaut() || "BigClass.xlsx"); // enregistrer dans le même répertoire que celui dans lequel ce script est enregistré // Créer en tant que classeur Excel dt2 = Open("$SAMPLE_DATA/Abrasion.jmp", invisible); Créer un classeur Excel (Obtenir le répertoire par défaut() || "MyWorkbook.xlsx", {dt, dt2}, {"Big", "Abrasive"}); Fermer(dt, pas de sauvegarde); Fermer(dt2, pas de sauvegarde); Ouvrir (Obtenir le répertoire par défaut ()); Try(Supprimer le fichier(Obtenir le répertoire par défaut() || "BigClass.xlsx")); Try(Supprimer le fichier(Obtenir le répertoire par défaut() || "MyWorkbook.xlsx")); //############################################### ################################# //### Fichiers texte //####### ################################################# ######################### txt1 = Charger le fichier texte("$SAMPLE_IMPORT_DATA/Animals.txt"); txt2 = Charger le fichier texte("$SAMPLE_IMPORT_DATA/Animals_L.txt"); dt_txt = Ouvrir("$SAMPLE_IMPORT_DATA/Animaux_L.txt"); // si les données sont correctement formatées, Open() peut fonctionner Enregistrer le fichier texte (Obtenir le répertoire par défaut() || "example.txt", "line1\!Nline2\!N", mode("replace")); Enregistrer le fichier texte (Obtenir le répertoire par défaut() || "example.txt", "line3\!Nline4\!N", mode("append")); txt4 = Charger le fichier texte (Obtenir le répertoire par défaut() || "example.txt"); Try(Supprimer le fichier(Obtenir le répertoire par défaut() || "example.txt")); // Pour lire le texte ligne par ligne, utilisez Words() avec le séparateur correct // Quelques séparateurs possibles, \!N, \!r, \!n all_lines = Words(txt2, "\!N"); For Each({line}, all_lines, show(line); //Show(Words(line, "\!t")); ); // Certaines ruses s'ouvrent en tant que script et utilisent ScriptBox my_scriptwindow = Open("$SAMPLE_IMPORT_DATA/Animals_L.txt", "script"); my_scriptwindow << Afficher la fenêtre (0); myfile_lines = my_scriptwindow[scriptBox(1)] << getLines(); my_scriptwindow << fermer la fenêtre ; attendre(0); show(all_lines, myscript_lines); txt3_line3 = Charger le fichier texte("$SAMPLE_IMPORT_DATA/Animals_line3.txt"); // les données commencent à la ligne 3 // Selon ce que vous voulez faire, vous pouvez supprimer les lignes inutiles (1 et 2) lines = Words(txt3_line3, "\!N"); // soyez prudent avec Words() car il combinera les séparateurs Remove From(lines, 1, 1); // puis enregistrez-le, rouvrez ou créez une table en boucle ou simplement Ouvrir avec Blob // Avancé... vous pouvez utiliser Blob avec Ouvrir. Il y a une explication quelque part dans la communauté par
@Craige_Hales dt = Open(Char To Blob(Concat Items(lines, "\!N")), "text"); //"texte" doit être ici //####################################### ########################################## //### Fichiers XML / /################################################ ################################# // Je l'ai très rarement utilisé, mais ce script peut donner une idée / / Parse XML, XML Attr et XML Text file_contents = Charger le fichier texte("$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, // suppose que la première ligne correspond aux noms de colonnes 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)), // suppose que la première ligne a des noms de colonnes Column(col)[row - 1] = data// et les autres lignes contiennent des données ); ) ) ); // Ouvrir avec export XML réalisé avec interactive. Peut-être des moyens d'obtenir ce travail dt = Open( "$SAMPLE_IMPORT_DATA/BigclassExcel.xml", XML Settings( Stack(0), Row("/Workbook/Worksheet/Table/Row/Cell/Data"), Col( "/ Classeur/Feuille de calcul/Table/Ligne/Cellule/Données", Nom de la colonne ("Données"), Remplissage ("Utiliser une fois"), Type ("Caractère"), Format ({"Meilleur"}), Type de modélisation ("Continu ") ) ), XML Wizard(1) // XML Wizard(0) pour désactiver ui ); //############################################### ################################## //### Fichiers DLL et Batch (Voir Session 5 (Charger DLL et exécuter le programme()) //########################################## ####################################### // DLL // Voir 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), renvoie (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(); // Fichier batch (.bat) // Une note rapide sur les fichiers batch // - Pas d'espaces de fin // - Doit ajouter un 'NewLine' mybat_string = " echo off \!n cls \!n echo Hello World \!n echo L'heure est " || Char(MDYHMS(Today())) || " \!n "; mybat_path = Obtenir le répertoire par défaut () || "testbatch.bat" ; Enregistrer le fichier texte (mybat_path, mybat_string, Mode("replace")); // Si nous avons besoin de retourner le résultat, vous pouvez utiliser Run Program bat_path = Convert File Path(mybat_path, windows); rp1 = Run Program( Executable(bat_path), ReadFunction("text") ); Show(Le répertoire existe("C:\SCRIPTERSCLUBTEST")); mybat_string2 = "\[mkdir "C:\SCRIPTERSCLUBTEST\" \!n]\" ; mybat_path = Obtenir le répertoire par défaut() || "testbatch.bat" ; mybat_path = Convertir le chemin du fichier (mybat_path, windows); Enregistrer le fichier texte(mybat_path, mybat_string2, Mode("replace")); Ouvrir(mybat_path); // cela exécutera la chauve-souris Show(Directory Exists("C:\SCRIPTERSCLUBTEST")); attendre(3); // nous devrons attendre Show(Directory Exists("C:\SCRIPTERSCLUBTEST")); // Ou utilisez DLL Try(Delete Directory("C:\SCRIPTERSCLUBTEST")); attendre(0); Show(Le répertoire existe("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(Le répertoire existe("C:\SCRIPTERSCLUBTEST")); attendre(3); // nous devrons attendre. Le temps dépend de .bat exécuté Show(Directory Exists("C:\SCRIPTERSCLUBTEST")); Try(Supprimer le fichier(mybat_path)); Try(Supprimer le répertoire("C:\Users\SCRIPTERSCLUBTEST")); //############################################### ################################## //### Fichiers JSON //### il existe de nombreux fichiers différents fonctions, rechercher l'index de script pour "JSON" //###################################### ########################################### json1 = Charger le fichier texte (Obtenir Répertoire par défaut() ||"Big Class_column.json", "JSON"); // tableau associatif json2 = Charger le fichier texte (Obtenir le répertoire par défaut() ||"Big Class_row.json"); // chaîne // Analyse JSON(json2); // Utilisation de l'ouverture interactive avec aperçu 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", Nom de la colonne ("age"), Fill("Use Once"), Type("Numeric"), Format({"Best"}), Modeling Type("Continuous")), Col("/root/ sexe", Nom de colonne ("sexe"), Remplissage("Utiliser une fois"), Type("Caractère"), Format({"Meilleur"}), Type de modélisation ("Continu")), Col("/root/ hauteur", Nom de colonne ("hauteur"), Remplissage("Utiliser une fois"), Type("Numérique"), Format({"Meilleur"}), Type de modélisation ("Continu")), Col("/root/ weight", Nom de la colonne ("weight"), Fill("Use Once"), Type("Numeric"), Format({"Best"}), Modeling Type("Continuous")) ), JSON Wizard(0) ); // Si le format JSON est facile à utiliser pour JMP, Open peut fonctionner dt2 = Open(Get Default Directory() ||"Big Class_row.json"); // Parfois, il peut être utile d'utiliser l'astuce Open(Blob()) dt3 = Open(Char To Blob(json2), "json"); // ouvre le texte dans la table Try(Close(dt, no save)); Try(Fermer(dt2, pas de sauvegarde)); Try(Fermer(dt3, pas de sauvegarde)); // JSON vers AA et AA vers JSON my_json_str = "{ \!" myChar\!" : \!"Valeur du caractère\!", \!"monNum\!" : 12345}" ; aa_json = Parse JSON(my_json_str); json_str = As JSON Expr(aa_json); // retour à JSON // aa_json2 = Parse JSON(json_str); //############ ################################################# #################### //### Requêtes HTTP (GET) //################## ################################################# ############## // peut être utilisé pour tester des requêtes simples
https://httpbin.org/ request = New HTTP Request( URL("
https://httpbin.org//get "), Method("GET"), Timeout(5) // la valeur par défaut est 60. Je suggère de le modifier au besoin et en fonction du serveur ); données = requête << Envoyer ; // Voir l'index des scripts pour plus de messages liés à la nouvelle requête HTTP // request << Get Last URL; // demande << Obtenir le statut ; aa_json = Analyser JSON(données); //############################################### ################################## //### Travailler avec des bases de données (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# //######## ################################################# ######################## // Le format général (à ma connaissance) pour la chaîne de connexion est // connection_str ="DSN=MYDSN_NAME;UID=USERNAME; PWD=MOT DE PASSE" ; // dsn_string = "Driver={ODBC DRIVER};Dbq=DBDSNNAME;UID=DBUSERNAME;PWD=DBPASSWORD;"; (la partie pilote n'est pas toujours nécessaire) // Lorsque la nouvelle requête SQL est utilisée, vous devez préfixer avec ODBC : //dsn_string = "ODBC:Driver={ODBC DRIVER};Dbq=DBDSNNAME;UID=DBUSERNAME;PWD=DBPASSWORD; " ; // Si vous êtes en mesure de créer une requête à l'aide du générateur de requêtes de JMP dans votre base de données, vous pouvez obtenir une chaîne de connexion à partir de là // elle peut contenir beaucoup plus d'informations, mais vous pouvez très probablement la simplifier // CELLES-CI DÉPENDENT DE VOTRE BASE DE DONNÉES // Le service informatique pourrait être en mesure d'aider avec ces //
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 // Soyez également prudent lorsque vous partagez des tables qui ont des scripts de table créés par une requête de base de données car ceux-ci peuvent contenir des mots de passe // Masquer la préférence de chaîne de connexion ODBC peut aider à cela (
https://community.jmp.com/ t5/JMP-Knowledge-Base/Database-table-scripts-Update-from-Database-Modify-etc-or/ta-p/621050) sqlite_path = Obtenir le répertoire par défaut() || "QCdata.sqlite" ; connection_str = Eval Insert("SQLite:Database=^sqlite_path^"); sql_str = "sélectionner * du lot" ; // Ouvrir la base de données dt = Ouvrir la base de données(connection_Str, sql_str, "NewTable"); // Créer une connexion à la base de données, exécuter SQL, fermer la connexion à la base de données dbc = Créer une connexion à la base de données (connection_str); dt = Exécuter SQL(dbc, sql_str, "NewTable"); Fermer la connexion à la base de données (dbc); // Nouvelle requête SQL (à ma connaissance, c'est la méthode préférée) sql_obj = New SQL Query(Connection(connection_str), Custom SQL(sql_str)); dt = sql_obj << Exécuter ; // utilise les préférences jmp des utilisateurs dt = sql_obj << Run Background; // Laissera JMP fonctionner dt = sql_obj << Run Foreground; // Bloquera l'exécution de JMP jusqu'à la fin de la requête // Vous pouvez définir les scripts OnRunComplete sur Nouvelle requête SQL (voir l'index des scripts) sql_obj << Run Foreground(OnRunComplete(Write("Number of rows in query result: ", N Rows(queryResult) ))); // n'imprimera pas dans le journal intégré // Il y a aussi OnRunCanceled et OnError // Quelques "conseils" SQL // Utilisez les modèles connection_str et sql_template (vous pouvez même les enregistrer dans de simples fichiers .jsl) dsn_string = Eval Insert("SQLite : Base de données=^sqlite_path^"); sql_template = "\[select * from lot where lot in (¤lotnr¤)]\"; numéro de lot = "'API00017'" ; sql_str = Eval Insert(sql_template, "¤"); // insère des valeurs dans votre modèle sql_obj = New SQL Query(Connection(dsn_string), Custom SQL(sql_str)); dt = sql_obj << Exécuter le premier plan ; numéro de lot = "'API00017', 'API00058'" ; sql_str = Eval Insert(sql_template, "¤"); sql_obj = Nouvelle requête SQL (Connexion (dsn_string), SQL personnalisé (sql_str)); dt = sql_obj << Exécuter le premier plan ; // Si les requêtes de base de données ne génèrent pas d'erreurs et que vous pouvez essayer d'utiliser Log Capture() pour capturer les problèmes sql_error = Log Capture(dt = Open Database(connection_Str, sql_str, "NewTable")); afficher (sql_error); If(Contains(sql_error, "[ODBC Driver Manager]"), Throw(sql_error); ); // Peut-être une bonne idée de vérifier si dt est vide ou n'a pas de lignes Is Empty(dt10); N lignes(dt); // cela générera une erreur si dt n'existe pas // Utilisez Query pour effectuer des requêtes SQL avec des tables de données OPEN JMP dt = Open("$SAMPLE_DATA/Big Class.jmp", Invisible); dt_result = Query(dt, "SELECT name, age, height FROM 'Big Class' WHERE age > 14;" ); // Utilisation d'alias, réalisation d'une jointure 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; ]\" ); // Requête qui retourne une valeur scalaire retval1 = Query(Scalar, dt, "SELECT AVG(height) from 'Big Class';"); // Requête sans tables retval2 = Query(Scalar, "SELECT SQRT(152399025);"); // pourrait être fait sans sql, mais il est bon d'avoir des options avg_height = Col Mean(Column(dt, "height")); sqrt_val = Sqrt(152399025); // fonctions disponibles
https://www.jmp.com/support/help/en/16.2/#page/jmp/sql-functions-available-for-jmp-queries.shtml#ww998370 // Certaines tâches sont parfois plus facile à réaliser avec SQL (si vous pouvez écrire la requête) qu'avec JMP dt = Open("$SAMPLE_DATA/Big Class.jmp", Invisible); // un exemple pourrait être la concaténation des valeurs en une seule colonne par groupe // Cela peut être utile avant le résumé ou la division par exemple pour éviter de perdre des données dt_result = Query(dt, "\[SELECT age, group_concat(name, ', ') noms FROM 'Big Class' GROUP BY age ]\" ); //############################################### ################################## //### fichiers zip (index de script pour plus d'informations) // https

/
www.jmp.com/support/help/en/16.2/#page/jmp/zip-archives.shtml?os=win&source=application#1931138 //############# ################################################# ################### za = Ouvrir (Obtenir le répertoire par défaut() || "dossier1.zip", zip); // s'ouvre en tant qu'objet d'archive zip dirlist = za << dir; // renvoie la liste des membres de la liste za << Write("newfile.txt", "this is newfiledata"); // écrit un nouveau fichier dirlist = za << dir; // texte = za << Lire(listerépertoire[2]); // lire à partir de l'archive zip // Compresser le dossier dans un fichier Zip (
@Justin_Chilton) //
https://community.jmp.com/t5/JSL-Cookbook-Archived/Compress-a-Folder-into-a-Zip- Fichier/ta-p/48878 //######################################### ######################################### //### Importation de fichiers multiples ( MFI) //
https://www.jmp.com/support/help/en/16.2/#page/jmp/utility-functions.shtml?os=win&source=application#ww7168938 //### Peut être utile lorsque vous avoir plusieurs fichiers .csv similaires par exemple //### Essayez-le d'abord de manière interactive, puis copiez le script //### Vous pouvez également obtenir une liste de fichiers en utilisant Files In Directory() et en boucle dessus mais //# ## MFI a des fonctionnalités supplémentaires //########################################## ######################################## mfi = Multiple File Import( <, Add Rows(Page(n),
, Rect(top, left, right, bottom), , ), ...)) | PDF Tous les tableaux(< Combiner(Tous | En-têtes correspondants | Aucun)>, , ) | Texte PDF (, ) | Assistant PDF );*/ dt = Open("$SAMPLE_DATA\Big Class.jmp"); w = Nouvelle fenêtre("test", Data Table Box(dt)); w << enregistrer l'image (Get Default Directory() || "test.pdf", pdf); w << fermer la fenêtre ; close(dt, pas de sauvegarde); pdftable = Open(Get Default Directory() || "test.pdf", PDF All Tables(Combine(all))); // juste quelques lignes pdftable2 = Open(Get Default Directory() || "test.pdf", PDF Tables(Table(Table Name("test"), Add Rows(Page(1), Rect(0, 0 , 5, 3))))); Fermer (pdftable, pas de sauvegarde); Fermer(pdftable2, pas de sauvegarde); Try(Supprimer le fichier(Obtenir le répertoire par défaut() || "test.pdf"));