몇 시간 동안 인터넷을 검색해도 내가 원하는 것을 어떻게 달성할 수 있는지에 대한 명확한 답이 없는 것 같고, 여러 번의 코딩 시도 후에 JSL이 다른 프로그래밍 언어와 극적으로 다른 영역 중 하나임이 분명합니다. 클라이언트용 사용자 지정 VBA 프로그램에서 데이터베이스로 사용되는 CSV 파일이 있습니다. CSV 파일을 사용하는 이유는 주로 이전 버전의 사용자 정의 도구가 필요했기 때문에 전문적인 내보내기 기능을 만들지 않고도 데이터베이스를 JMP로 쉽게 가져와 정기적인 분석을 수행할 수 있기 때문입니다. 성능 분석을 수행할 수 있도록 데이터 테이블이 모든 것을 갖출 수 있도록 데이터베이스 파일을 가져오고 사전 준비를 수행하는 스크립트를 작성하고 있습니다. 이것의 대부분은 매우 일상적이며 지금까지 내 JSL 스크립트에서 수행되었습니다.
지금 내가 가지고 있는 문제는 실제로 누락된 값이어야 하는 여러 위치에 0 값이 있다는 것입니다. 0은 VBA의 데이터 개체를 사용하여 Excel에서 데이터를 내보낸 결과입니다.사용자 지정 Excel 도구는 완전히 GUI 기반이므로 데이터베이스 파일의 데이터는 워크시트에 없습니다. 따라서 실제로 누락된 데이터는 코드에서 데이터 개체를 구성하는 속성에서 기본값 0을 갖습니다. VBA에는 숫자 데이터 유형에 대한 누락된 데이터가 없습니다.
따라서 내가 원하는 것은 특정 열의 0을 다른 열의 플래그를 기반으로 누락된 값으로 바꾸는 것입니다. 예를 들어, "Canceled Reads Data" 열이 주어진 행에 'False'인 경우 취소된 읽기 조사가 해당 특정 행에 대해 수행되지 않았으므로 해당 행에 대해 취소된 읽기 조사와 관련된 모든 열에 값이 누락되어야 합니다. 기록. 마찬가지로 "Survey Canceled" 열의 값이 'True'이면 해당 레코드에 대해 어떤 유형의 조사도 수행되지 않았으므로 해당 행의 모든 조사 데이터 열에 누락된 값이 포함되어야 합니다. 0이 있으면 JMP가 분석에 무시해야 하는 레코드를 포함하기 때문에 다양한 통계가 왜곡됩니다.
나는 두 가지 다른 방법을 시도했지만 아무 소용이 없습니다. 첫 번째는 조건을 사용하고 열을 반복하는 것입니다.
// set canceled data to missing if canceled survey was not performed
If(:Canceled Reads Data == "True",
{
For(i = vehiclePackageColumn, i < expiredReadsColumn, i++,
Column(i) = .
)
}
);여기서 문제의 일부는 vehiclePackageColumn = Column("Vehicle Packages")을 사용하면 "Vehicle Packages" 열에 대한 열 번호를 반환하지 않기 때문에 열 참조(vehiclePackageColumn 및 expiredReadsColumn)가 열 번호가 아니라는 것입니다. 사실 JSL을 사용하여 컬럼에 대한 컬럼 인덱스(숫자)를 캡쳐하는 방법에 대한 정보를 찾을 수 없었습니다.
두 번째 방법은 다른 포럼에서 본 내용을 기반으로 합니다.
cancelSurveyStatus = Column(inboundDataTable, "Canceled Reads Data") << Get Values;
dataMissing[Loc(canceledSurveyStatus == "False")] = .;
Column(inboundDataTable, "Canceled Reads") << Set Values(dataMissing);
이에 대한 도움을 주시면 감사하겠습니다.
그것을 시도했다. 훌륭하게 작동합니다. 다시 한 번 감사드립니다.
이것은 쉬운 것입니다.
colnames = dt << 열 이름 가져오기(문자열);
startindex = contains(colnames, "시작 열의 이름");
endindex = contains(colnames, "마지막 열의 이름");
예!
이는 특정 열의 플래그 상태를 기반으로 누락된 값을 열 범위로 가져오는 주요 문제를 해결하는 것 같았습니다(Jim). 따라서 남은 유일한 문제는 열 인덱스를 캡처하는 방법이 있는지 여부입니다. 내 데이터 테이블은 다소 크고 제안된 코드 테스트에서 수행한 것처럼 수동으로 열을 계산해야 하는 것은 지루하고 오류가 발생하기 쉽습니다. 이 특정 데이터 테이블에는 73개의 열이 있습니다.JSL에서 명명된 열의 열 번호를 결정하는 수단이 없다는 것은 이와 같은 작업에만 해당되는 경우 심각한 누락입니다.
이것이 효과가 있다고 생각합니다.
dt = 현재 데이터 테이블();
For( i = 시작 열 번호, i <= 종료 열 번호, i++,
column( dt, i ) [ dt << get rows where( :Canceled Reads Data == "True")] = .;
);