빈 while 조건이 작동하지 않는 For 루프를 사용하여 연관 배열 반복나는 주로 https://community.jmp.com/t5/JSL-Cookbook/Looping-through-an-Associative-Array-s-elements/tac-p/381693#M112 연관 배열을 반복하는 방법에 대해 설명합니다. 내 이해는 반복기가 값이 아닌 키를 반복하지만 값에 쉽게 액세스 할 수 있다는 것은 배열이 있다는 것입니다.
내 코드는 다음과 같습니다.
Names Default To Here(1);
dt1 = Open("file path" );
dt2 = Open("file path 2");
Summarize(dt1, IDs = by(:ID)); //this finds all the unique IDs in the data file, which we will need
//First, populate the temporary data structure--associative array--from the dt1 data file which we will then copy over to the dt2 data file.
For (i=1, i<=N Items(IDs), i++,
ID = IDs[i];
temp_array = Associative Array ({"Val1","Val2","Val3"},{{},{},{}});
For ( temp = temp_array << First, Is Empty(temp_array[temp]), temp = temp_array << Next(temp),//looping through temp_array's keys is clunky but done this way in JMP
query_date = dt1 << Select Where (:"ID" == ID);
Write(query_date);
//etc not there yet because the above not working
);
);
이 시점에서 관심있는 변수는 query_date이며 계속 진행해야합니다.문제는 쓰여진 것처럼 내부 루프가 어떤 이유로 한 번도 실행되지 않는다는 것입니다. 루프의 while 조건은 루프가 종료되기를 원할 때까지 True로 평가되어야하므로 다음으로 설정했습니다.
Is Empty(temp_array[temp])
temp_array [temp]는 연관 배열의 첫 번째 값이기 때문에 temp는 첫 번째 키 "Val1"이고 값은 {}입니다. 중요한 질문은 Is Empty ()에서 {}가 True 또는 False로 평가됩니까? {}는 Google에서 처리하지 않는 특수 문자이기 때문에 Google에서도 검색 할 수 없습니다. 그래서 내가 왜 혼란스러워하는지 알 수 있습니다.
나머지 스크립트는 이미 코딩되어 있으며이 시점에서 사소한 오류로 작동 할 것이라고 확신하므로이 장애물을 극복 할 수 있다면 많은 도움이 될 것입니다. 의사 코드는 내 마음 속에서 매우 명확하며 새로운 JMP JSL 사용자로서 상황이 더 명확 해져서 감사합니다. 도와 주셔서 감사합니다!
마이크
데이터 테이블스크립팅Re : 빈 while 조건이 작동하지 않는 For 루프를 사용하여 연관 배열 반복for 루프의 조건은 키가 비어 있지 않은 동안 실행되어야합니다.
For ( temp = temp_array << First, ! Is Empty(temp), temp = temp_array << Next(temp),
연관 배열의 << first 및 << next 메서드는 키가 더 이상 없을 때 키 (문자열 또는 숫자) 또는 특수 empty () 값을 반환합니다. 해당 키 (비어 있지 않은 경우)는 연관 배열에 대한 인덱스로 사용할 수 있습니다.
! 이다 아니 운영자.
편집 : 당신은 이와 같은 것을 원할 수 있습니다
temp_array = Associative Array( {"Val1", "Val2", "Val3"}, {{1, 2}, {}, {3, 4, 5}} );
For( temp = temp_array << First, !Is Empty( temp ), temp = temp_array << Next( temp ),
If( N Items( temp_array[temp] ) > 0,
Write( "\!nkey=", temp, " has ", N Items( temp_array[temp] ), " elements" ),
Write( "\!nkey=", temp, " has no elements" )
)
);key = Val1에는 2 개의 요소가 있습니다.
key = Val2에는 요소가 없습니다.
key = Val3에는 3 개의 요소가 있습니다.
Re : 빈 while 조건이 작동하지 않는 For 루프를 사용하여 연관 배열 반복연관 배열을 사용하는 이유를 이해하지 못합니까?실행하려는 루프가 수행해야하는 작업을 확장 할 수 있습니까?
IsEmpty ()는 스크립트가 참조 된 항목이 무엇인지 모르는 경우 1을 반환하고 IsEmpty () 실행 전에 참조 된 항목이 스크립트에서 사용 된 경우 0을 반환하는 함수입니다.
따라서:
a={};
isEmpty(s);
// returns 0 since a has been referenced prior in the script
isEmpty(b);
// returns 1 since JMP has not seen the variable b before
에 관하여
query_date = dt1 << Select Where (:"ID" == ID);
Select Where ()는 작업을 수행하지만 아무것도 반환하지 않습니다.따라서 query_date에는 값이 없습니다.Select Where ()는 선택 기준을 충족하는 데이터 테이블의 모든 행에 대해 선택된 행 상태를 "켜기"로 설정합니다.데이터 테이블에서 둘 이상의 행에 ID 값이있는 경우 여러 행이 선택됩니다.아마도 찾고있는 것은 선택한 행의 쿼리 날짜 값일 것입니다.선택한 행의 행 번호를 얻을 수 있습니다.
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
스케일러가 아닌 행 번호의 행렬을 반환합니다.따라서 query_date를 얻으려면 아래 첨자를 참조해야합니다.
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
query_date = dt1:query_date[ theRows[1] ];
선택 단계가 필요하지 않은 더 간단한 양식은 Get Rows Where ()를 사용하는 것입니다.
query_date = dt1:query_date[ dt1 << get rows where( :ID == ID )[1] ];
내가 돕고 혼란스럽지 않기를 바랍니다.계속해서 질문 해주세요.
Re : 빈 while 조건이 작동하지 않는 For 루프를 사용하여 연관 배열 반복고마워요, 짐. 빠른 응답에 감사드립니다. 감사합니다. 이 모든 것을 다시 분석 할 시간을주세요. 주말입니다.
마이크Re : 빈 while 조건이 작동하지 않는 For 루프를 사용하여 연관 배열 반복답장 해주셔서 감사합니다, 짐. 한 가지 : 이해가 안 돼
query_date = dt1:query_date[ theRows[1] ];
query_date는 아직 인스턴스화되지 않았습니다.
이것은 오타입니까 (다른 변수라고 가정)?
로그는 여기에서도 오류를 발생시킵니다.
Scoped data table access requires a data table column or variable in access or evaluation of 'dt_ld4:query_date' , dt_ld4:query_date/*###*/
나는 일반적으로 이것을 스스로 알아낼 것이지만이 문제는 놀랍도록 도전적이므로 완전히 확신하지 못합니다.
무리 감사,
마이크
Re : 빈 while 조건이 작동하지 않는 For 루프를 사용하여 연관 배열 반복안녕하세요 Craige. 이것은 작동하는 것 같습니다. 대단히 감사합니다.
남자 이름
Re : 빈 while 조건이 작동하지 않는 For 루프를 사용하여 연관 배열 반복알았어 ... 추측하고 있었어.query_date를 찾아야한다고 표시했으며 Select Where ()와 관련이있는 것으로 나타났습니다.그래서 데이터 테이블에 query_date라는 열이 있고 Select Where () 또는 Get Rows Where ()가 원하는 쿼리 날짜가있는 행을 반환 할 것이라고 생각했습니다.그리고 분명히 쿼리 날짜를 찾을 수있는 위치에 대해 잘못 추측했습니다.
Re : 빈 while 조건이 작동하지 않는 For 루프를 사용하여 연관 배열 반복나는 뛰고있어
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
Write(theRows);
theRows를 선택하는 것이 작동하는지 확인하기 위해서입니다.하지만 우리가 그렇게 멀리가는 것 같지는 않습니다. 다음을 인쇄합니다.
[](0, 1)
루프를 통한 각 반복에 대해 데이터 테이블에서 매우 포괄적 인 행 (20 개 열 이상)을 인쇄해야합니다. 나는 무슨 일이 일어나고 있는지 전혀 모른다.
암시 적 질문에 답하기 위해 theRows는 루프에 지정된 값과 일치하는 ID 열 값의 결과 인 행을 찾기위한 임시 변수 일뿐입니다 (ID의 여러 복사본으로 인해 이러한 특성의 여러 행이있을 수 있음).
이게 혼란 스러워요 ...하지만 그게 제가 고군분투하는 이유이기도합니다.
미리 감사드립니다.
마이크