//############################################### ################################ //### //### 8. 외부 파일 및 데이터베이스 작업 //### //#################################### ########################################### // 이 파일에서 // - 세션 7의 짧은 요약(범위/네임스페이스 및 보고서 레이어) // - .xlsx // - 텍스트 파일 // - xml 파일 // - json 파일 // - GET 요청 // - DLL ( 세션 5 참조) // - 배치 파일(세션 5 참조) // - 데이터베이스(.sqlite 데이터베이스 사용) // - 그림 // - pdf //################ ################################################# ################ //### 세션 7 요약(범위 속성 및 보고서 레이어) //
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 //### ################################################# ########################### // 범위 및 네임스페이스 // Names Default To Here(1)로 스크립트 시작; // Names Default To Here 모드를 활성화하면 Here라는 범위가 실행 스크립트와 연결됩니다. // 다른 스크립트가 손상될 수 있으므로 프로덕션 코드를 따라가지 마십시오. Clear Symbols(); 전역 지우기(); 기호 삭제(); 전역 삭제(); // 어떤 메시지 객체가 있는지 보려면 Show Properties(obj)를 사용할 수 있습니다. // 보고서 레이어 // 보고서 레이어를 탐색하려면 obj << Show Properties; 및 obj << 트리 구조 표시; (obj << Get XML;) // rep = obj << Report를 사용하여 보고서 레이어에 액세스합니다. 또는 보고서(obj); // 보고서 첨자(첫 번째 일치 반환) param_tratio2 = biv_report[Outline Box("Parameter Estimates"), Number Col Box("t Ratio")]; // obj << Get XML 사용; XPath를 사용하기 전에 XML이 어떻게 보이는지 확인하려면 // XPath(일치 목록을 반환하고 목록에 메시지를 보낼 수 있음) biv_report << XPath("//OutlineBox[contains(text(), 'Bivariate Normal Ellipse')]" ); //############################################### ################################ //### //### 외부 파일 작업 // ### //############################################ ################################## //############ ################################################# #################### //### JMP 데이터 테이블 알림(세션 6 참조) //############## ################################################# ################### dt = Open("$SAMPLE_DATA/Big Class.jmp"); // Invisible, Private m_num = dt << get as matrix; 이름 = 열(dt, "이름") << 값 가져오기; all_vals = dt[0, 0]; // 목록 목록 dt[0, {"높이", "무게"}]; // 열이 숫자이기 때문에 행렬 Close(dt, no save); //############################################### ################################## //### 엑셀 파일 //####### ################################################# ######################## // 대화형으로 열기 먼저 열어서 기본 설정을 가져오고 필요에 따라 수정 // 또는 스크립팅 인덱스에서 구문을 확인하고 희망 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 데이터 테이블을 엑셀 워크북으로 저장 dt = Open("$SAMPLE_DATA/Big Class.jmp", invisible); dt << Save(Get Default Directory() || "BigClass.xlsx"); // 이 스크립트가 저장된 것과 동일한 디렉토리에 저장 // Excel 통합 문서로 생성 dt2 = Open("$SAMPLE_DATA/Abrasion.jmp", invisible); Excel 통합 문서 만들기(Get Default Directory() || "MyWorkbook.xlsx", {dt, dt2}, {"Big", "Abrasive"}); 닫기(dt, 저장하지 않음); 닫기(dt2, 저장하지 않음); Open(기본 디렉토리 가져오기()); Try(Delete File(Get Default Directory() || "BigClass.xlsx")); Try(Delete File(Get Default Directory() || "MyWorkbook.xlsx")); //############################################### ################################ //### 텍스트 파일 //####### ################################################# ######################### txt1 = 텍스트 파일 로드("$SAMPLE_IMPORT_DATA/Animals.txt"); txt2 = 텍스트 파일 로드("$SAMPLE_IMPORT_DATA/Animals_L.txt"); dt_txt = 열기("$SAMPLE_IMPORT_DATA/Animals_L.txt"); // 데이터가 깨끗한 형식이면 Open()이 작동할 수 있음 Save Text File(Get Default Directory() || "example.txt", "line1\!Nline2\!N", mode("replace")); 텍스트 파일 저장(Get Default Directory() || "example.txt", "line3\!Nline4\!N", mode("append")); txt4 = 텍스트 파일 로드(Get Default Directory() || "example.txt"); Try(Delete File(Get Default Directory() || "example.txt")); // 텍스트를 한 줄씩 읽으려면 올바른 구분 기호와 함께 Words()를 사용합니다. // 일부 가능한 구분 기호는 \!N, \!r, \!n입니다. all_lines = Words(txt2, "\!N"); For Each({line}, all_lines, show(line); //Show(Words(line, "\!t")); ); // 스크립트로 열고 ScriptBox를 사용하는 속임수 my_scriptwindow = Open("$SAMPLE_IMPORT_DATA/Animals_L.txt", "script"); my_scriptwindow << 창 표시(0); myfile_lines = my_scriptwindow[scriptBox(1)] << getLines(); my_scriptwindow << 창 닫기; 대기(0); show(all_lines, myscript_lines); txt3_line3 = 텍스트 파일 불러오기("$SAMPLE_IMPORT_DATA/Animals_line3.txt"); // 데이터는 3행에서 시작합니다. // 수행하려는 작업에 따라 불필요한 행(1 및 2)을 제거할 수 있습니다. lines = Words(txt3_line3, "\!N"); // Words()는 분리자를 결합하므로 주의하십시오. Remove From(lines, 1, 1); // 그런 다음 저장하고 다시 열거나 루핑하여 테이블을 작성하거나 Blob으로 열기 // 고급... Blob을 열기로 사용할 수 있습니다. 커뮤니티 어딘가에
@Craige_Hales dt = Open(Char To Blob(Concat Items(lines, "\!N")), "text"); //"텍스트"는 여기에 있어야 합니다. //######################################## ######################################## //### XML 파일 / /################################################ ############################### // 나는 이것을 거의 사용하지 않았지만 이 스크립트는 아이디어를 줄 수 있습니다 / / XML, XML 속성 및 XML 텍스트 구문 분석 file_contents = 텍스트 파일 로드("$SAMPLE_IMPORT_DATA/BigclassExcel.xml"); 구문 분석 XML(file_contents, OnElement( "워크시트", StartTag( sheetname = XML Attr("Name"); show(sheetname); dt = New Table(sheetname); row = 1; col = 1; ) ), OnElement( " Row", StartTag( If(row > 1, // 첫 번째 행이 열 이름이라고 가정 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)), // 첫 번째 행에 열 이름이 있다고 가정 Column(col)[row - 1] = 데이터// 및 다른 행에는 데이터가 있음 ); ) ) ); // 대화형으로 만든 XML 내보내기로 엽니다. 이 작업을 수행하는 방법이 있을 수 있습니다. dt = Open( "$SAMPLE_IMPORT_DATA/BigclassExcel.xml", XML Settings( Stack(0), Row("/Workbook/Worksheet/Table/Row/Cell/Data"), Col( "/ Workbook/Worksheet/Table/Row/Cell/Data", Column Name("Data"), Fill("한 번 사용"), Type("Character"), Format({"Best"}), Modeling Type("Continuous" ") ) ), XML Wizard(1) // XML Wizard(0) ui 비활성화 ); //############################################### ################################# //### DLL 및 배치 파일(세션 5(DLL 로드 참조) 프로그램 실행()) //######################################### ###################################### // DLL // 참조 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(); // 배치 파일(.bat) // 배치 파일에 대한 빠른 메모 // - 후행 공백 없음 // - '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"; 텍스트 파일 저장(mybat_path, mybat_string, Mode("replace")); // 반환 결과가 필요한 경우 Run Program을 사용할 수 있습니다. bat_path = 파일 경로 변환(mybat_path, windows); rp1 = 프로그램 실행( Executable(bat_path), ReadFunction("text") ); Show(디렉토리 존재("C:\SCRIPTERSCLUBTEST")); mybat_string2 = "\[mkdir "C:\SCRIPTERSCLUBTEST\" \!n]\"; mybat_path = 기본 디렉토리 가져오기() || "testbatch.bat"; mybat_path = 파일 경로 변환(mybat_path, windows); 텍스트 파일 저장(mybat_path, mybat_string2, Mode("replace")); 열기(mybat_path); // 박쥐를 실행합니다. Show(Directory Exists("C:\SCRIPTERSCLUBTEST")); 대기(3); // 기다려야 합니다 Show(Directory Exists("C:\SCRIPTERSCLUBTEST")); // 또는 DLL 사용 Try(Delete Directory("C:\SCRIPTERSCLUBTEST")); 대기(0); Show(디렉토리 존재("C:\SCRIPTERSCLUBTEST")); kernel32 = LoadDLL("커널32"); kernel32 << DeclareFunction( "WinExec", Convention(STDCALL), Alias("WinExec"), Arg(AnsiString, "lpCmdLine"), Arg(Int32, "uCmdShow"), Returns(Int32) ); kernel32 << WinExec(mybat_path, 5); Show(디렉토리 존재("C:\SCRIPTERSCLUBTEST")); 대기(3); // 기다려야 합니다. 시간은 .bat run Show(Directory Exists("C:\SCRIPTERSCLUBTEST")); 에 따라 다릅니다. Try(파일 삭제(mybat_path)); Try(디렉터리 삭제("C:\Users\SCRIPTERSCLUBTEST")); //############################################### ################################# //### JSON 파일 //### 다양한 파일이 있습니다. 함수, "JSON"에 대한 검색 스크립팅 인덱스 //###################################### ######################################### json1 = 텍스트 파일 로드(가져오기) 기본 디렉터리() ||"Big Class_column.json", "JSON"); // 연관 배열 json2 = 텍스트 파일 로드(Get Default Directory() ||"Big Class_row.json"); // 문자열 // 구문 분석 JSON(json2); // 미리보기로 대화형 열기 사용 dt = Open( "/H:/JSL Course/session 8/Big Class_row.json", JSON Settings( Stack(0), Row("/root"), Col("/root/ 이름", 열 이름("이름"), 채우기("한 번 사용"), 유형("문자"), 형식({"최고"}), 모델링 유형("연속")), Col("/root/ age", 열 이름("age"), Fill("한 번 사용"), Type("Numeric"), Format({"Best"}), Modeling Type("Continuous")), Col("/root/ sex", Column Name("sex"), Fill("한 번 사용"), Type("Character"), Format({"Best"}), Modeling Type("Continuous")), Col("/root/ 높이", 열 이름("높이"), 채우기("한 번 사용"), 유형("숫자"), 형식({"최고"}), 모델링 유형("연속")), Col("/root/ weight", Column Name("weight"), Fill("한 번 사용"), Type("Numeric"), Format({"Best"}), Modeling Type("Continuous")) ), JSON Wizard(0) ); // JSON이 JMP용으로 사용하기 쉬운 형식인 경우 Open이 작동할 수 있습니다. dt2 = Open(Get Default Directory() ||"Big Class_row.json"); // 때때로 Open(Blob()) 트릭을 사용하는 것이 유용할 수 있습니다. dt3 = Open(Char To Blob(json2), "json"); // 테이블에 텍스트 열기 Try(Close(dt, no save)); Try(Close(dt2, no save)); Try(Close(dt3, no save)); // JSON에서 AA로, AA에서 JSON으로 my_json_str = "{ \!"myChar\!": \!"문자 값\!", \!"내 번호\!": 12345}"; aa_json = JSON 구문 분석(my_json_str); json_str = As JSON Expr(aa_json); // 다시 JSON으로 // aa_json2 = JSON 구문 분석(json_str); //############ ################################################# ################### //### HTTP 요청(GET) //################### ################################################# ############## // 단순 요청을 테스트하는 데 사용할 수 있음
https://httpbin.org/ request = New HTTP Request( URL("
https://httpbin.org//get "), Method("GET"), Timeout(5) // 기본값은 60입니다. 필요에 따라 서버에 따라 수정하는 것이 좋습니다.); 데이터 = 요청 << 보내기; // 새로운 HTTP 요청과 관련된 더 많은 메시지는 스크립팅 인덱스를 참조하십시오. // request << Get Last URL; // 요청 << 상태 가져오기; aa_json = JSON 파싱(데이터); //############################################### ################################ //### 데이터베이스 작업(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# //######### ################################################# ####################### // 연결 문자열의 일반적인 형식은 // connection_str ="DSN=MYDSN_NAME;UID=USERNAME; PWD=비밀번호"; // dsn_string = "드라이버={ODBC DRIVER};Dbq=DBDSNNAME;UID=DBUSERNAME;PWD=DBPASSWORD;"; (드라이버 부분이 항상 필요한 것은 아닙니다.) // 새 SQL 쿼리를 사용할 때 ODBC 접두사를 사용해야 합니다. //dsn_string = "ODBC:Driver={ODBC DRIVER};Dbq=DBDSNNAME;UID=DBUSERNAME;PWD=DBPASSWORD; "; // JMP의 쿼리 빌더를 사용하여 데이터베이스에 대한 쿼리를 작성할 수 있는 경우 거기에서 연결 문자열을 얻을 수 있습니다. // 여기에는 훨씬 더 많은 정보가 포함될 수 있지만 단순화할 수 있습니다. // 이들은 데이터베이스에 따라 다릅니다. // IT 부서에서 다음과 같은 도움을 줄 수 있습니다. //
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 // 데이터베이스 쿼리로 생성된 테이블 스크립트가 있는 테이블을 공유할 때 암호가 포함될 수 있으므로 주의하십시오. // ODBC 연결 숨기기 문자열 기본 설정이 도움이 될 수 있습니다(
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 = "로트에서 * 선택"; // 데이터베이스 열기 dt = 데이터베이스 열기(connection_Str, sql_str, "NewTable"); // 데이터베이스 연결 생성, SQL 실행, 데이터베이스 연결 종료 dbc = 데이터베이스 연결 생성(connection_str); dt = SQL 실행(dbc, sql_str, "NewTable"); 데이터베이스 연결 종료(dbc); // 새 SQL 쿼리(내 지식으로는 이것이 선호되는 방법임) sql_obj = New SQL Query(Connection(connection_str), Custom SQL(sql_str)); dt = sql_obj << 실행; // 사용자 jmp 기본 설정 사용 dt = sql_obj << Run Background; // JMP가 작동하도록 합니다. dt = sql_obj << Run Foreground; // 쿼리가 완료될 때까지 JMP 실행을 차단합니다 // OnRunComplete 스크립트를 새 SQL 쿼리로 설정할 수 있습니다(스크립팅 색인 참조) sql_obj << Run Foreground(OnRunComplete(Write("Number of rows in query result: ", N Rows(queryResult) ))); // 포함된 로그에 인쇄되지 않음 // OnRunCanceled 및 OnError도 있음 // SQL "팁"이 거의 없음 // connection_str 및 sql_template 패턴 사용(간단한 .jsl 파일에 저장할 수도 있음) dsn_string = Eval Insert("SQLite: 데이터베이스=^sqlite_path^"); sql_template = "\[select * from lot in (¤lotnr¤)]\"; lotnr = "'API00017'"; sql_str = 평가 삽입(sql_template, "¤"); // 템플릿에 값 삽입 sql_obj = New SQL Query(Connection(dsn_string), Custom SQL(sql_str)); dt = sql_obj << 전경 실행; lotnr = "'API00017', 'API00058'"; sql_str = 평가 삽입(sql_template, "¤"); sql_obj = 새 SQL 쿼리(연결(dsn_string), 사용자 정의 SQL(sql_str)); dt = sql_obj << 전경 실행; // 데이터베이스 쿼리에서 오류가 발생하지 않고 Log Capture()를 사용하여 문제를 캡처할 수 있는 경우 sql_error = Log Capture(dt = Open Database(connection_Str, sql_str, "NewTable")); 쇼(sql_error); If(Contains(sql_error, "[ODBC 드라이버 관리자]"), Throw(sql_error); ); // dt가 비어 있는지 또는 행이 없는지 확인하는 것이 좋습니다. Is Empty(dt10); N행(dt); // dt가 존재하지 않으면 오류 발생 // 쿼리를 사용하여 OPEN JMP 데이터 테이블로 SQL 쿼리 수행 dt = Open("$SAMPLE_DATA/Big Class.jmp", Invisible); dt_result = Query(dt, "'Big Class'에서 이름, 나이, 키 선택 WHERE age > 14;" ); // 별칭 사용, 조인 수행 dtSAT = Open("$SAMPLE_DATA/SATByYear.jmp", Invisible); dtUS = Open("$SAMPLE_DATA/US Demographics.jmp", 보이지 않음); dt_result2 = Query( Table(dtSAT, "t1"), Table(dtUS, "t2"), "\[SELECT t1.State, t1."SAT 수학", t2."대학 학위", t2."8학년 수학 " FROM t1 LEFT OUTER JOIN t2 ON t1.State = t2.State WHERE t1.'SAT Math' > 550; ]\" ); // 스칼라 값을 반환하는 쿼리 retval1 = Query(Scalar, dt, "SELECT AVG(height) from 'Big Class';"); // 테이블이 없는 쿼리 retval2 = Query(Scalar, "SELECT SQRT(152399025);"); // sql 없이도 가능하지만 옵션이 있는 것이 좋습니다 avg_height = Col Mean(Column(dt, "height")); sqrt_val = Sqrt(152399025); // 사용 가능한 기능
https://www.jmp.com/support/help/en/16.2/#page/jmp/sql-functions-available-for-jmp-queries.shtml#ww998370 // 때때로 수행되는 작업이 있습니다. JMP dt = Open("$SAMPLE_DATA/Big Class.jmp", Invisible);보다 SQL로 수행하기가 더 쉽습니다(쿼리를 작성할 수 있는 경우). // 한 가지 예는 값을 그룹별로 단일 열에 연결하는 것입니다. // 이것은 예를 들어 데이터 손실을 방지하기 위해 요약 또는 분할 전에 유용할 수 있습니다. dt_result = Query(dt, "\[SELECT age, group_concat(name, ', ') 이름 FROM 'Big Class' GROUP BY age ]\" ); //############################################### ################################ //### zip 파일(자세한 내용은 스크립팅 색인) // 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); // zip 아카이브 객체로 열기 dirlist = za << dir; // 목록에 있는 멤버 목록 반환 za << Write("newfile.txt", "this is newfiledata"); // 새 파일 쓰기 dirlist = za << dir; // 텍스트 = za << Read(dirlist[2]); // zip 아카이브에서 읽기 // 폴더를 Zip 파일로 압축(
@Justin_Chilton) //
https://community.jmp.com/t5/JSL-Cookbook-Archived/Compress-a-Folder-into-a-Zip- 파일/ta-p/48878 //######################################## ####################################### //### 다중 파일 가져오기( MFI) //
https://www.jmp.com/support/help/en/16.2/#page/jmp/utility-functions.shtml?os=win&source=application#ww7168938 //### 예를 들어 비슷한 모양의 .csv 파일이 여러 개 있습니다. //### 먼저 대화식으로 시도한 다음 스크립트를 복사하세요. ## MFI에는 추가 기능이 있습니다. //########################################## ###################################### mfi = 다중 파일 가져오기( <<폴더 설정 ("$SAMPLE_IMPORT_DATA"), <, Add Rows(Page(n),
, Rect(top, left, right, bottom), , ), ...)) | PDF 모든 테이블(< Combine(All | Matching Headers | None)>, <최소 행(n)>, <최소 열(n)>) | PDF 텍스트 (<페이지(n, ...)>, <정렬>) | PDF 마법사 );*/ dt = Open("$SAMPLE_DATA\Big Class.jmp"); w = 새 창("테스트", 데이터 테이블 상자(dt)); w << 사진 저장(Get Default Directory() || "test.pdf", pdf); w << 창 닫기; 닫기(dt, 저장하지 않음); pdftable = Open(Get Default Directory() || "test.pdf", PDF All Tables(Combine(all))); // 일부 행 pdftable2 = Open(Get Default Directory() || "test.pdf", PDF Tables(Table(Table Name("test"), Add Rows(Page(1), Rect(0, 0) , 5, 3))))); 닫기(pdftable, 저장하지 않음); 닫기(pdftable2, 저장하지 않음); Try(Delete File(Get Default Directory() || "test.pdf"));