JSL에서 n 데이터 테이블을 동적으로 연결하는 방법초보 JMP 사용자인 동료를 위해 워크플로를 자동화하는 스크립트를 만들고 있습니다. 스크립트의 첫 번째 작업은 모델 실행에서 데이터의 모든 반복을 결합하는 것입니다. 이것은 다음과 같이 수행됩니다.
- 사용자에게 다음을 나타내는 개별 데이터 테이블의 디렉토리를 선택하라는 메시지가 표시됩니다. N 모델 실행의 반복.
- 이 스크립트는 "SGR Scenaio Iteration i"와 같이 사전 정의된 이름과 반복 번호가 있는 모든 반복 데이터 테이블을 엽니다.
- 각 반복 데이터 테이블이 열리면 반복 열이 추가되고 반복 번호로 미리 채워집니다.
- 모든 데이터 테이블이 열린 후 데이터 테이블 2~10이 첫 번째 데이터 테이블에 연결되어 "SGR Scenario Combined Iterations"라는 새로운 결합 데이터 테이블을 생성합니다.
- 그러면 원래 반복이 저장되지 않고 닫힙니다. 이는 원래 데이터 테이블을 보존하기 위한 것입니다.
위에 나열된 작업을 수행하는 스크립트의 첫 번째 부분에 대한 코드는 다음과 같습니다.
Names Default to Here(1);
Delete Symbols();
//----------------------------------------------------------------------------------------------
// Select file path, then import and combine all iteration data tables into a single data table
// of replicates of sorties completed across iterations.
//----------------------------------------------------------------------------------------------
path = Pick Directory("Select the directory containing the iteration files.");
iterationFile = path || "SGR Scenario Iteration 1.jmp";
dtIterationTables = Open(iterationFile, "Invisible");
// add Iteration column
dtIterationTables << New Column(
"Iteration",
Ordinal,
Set Each Value(1)
);
dtIterationTables << Move Selected Columns(
{"Iteration"},
After(:Time of Day)
);
// get remaining iteration tables
i = 2;
iterationFile = path || "SGR Scenario Iteration 2.jmp";
While(File Exists(iterationFile),
nTables = i;
dtIterationFile = Open(iterationFile, "Invisible");
// add Iteration column
dtIterationFile << New Column(
"Iteration",
Ordinal,
Set Each Value(i)
);
dtIterationFile << Move Selected Columns(
{"Iteration"},
After(:Time of Day)
);
//look for next iteration table
i++;
iterationFile = path || "SGR Scenario Iteration " || Char(i) || ".jmp";
);
// concatenate current interation table to first iteration table
// NOTE: AWAITING RESPONSE ON HOW TO MAKE THIS PROCESS DYNAMIC
Data Table("SGR Scenario Iteration 1") << Concatenate(
Data Table("SGR Scenario Iteration 2"),
Data Table("SGR Scenario Iteration 3"),
Data Table("SGR Scenario Iteration 4"),
Data Table("SGR Scenario Iteration 5"),
Data Table("SGR Scenario Iteration 6"),
Data Table("SGR Scenario Iteration 7"),
Data Table("SGR Scenario Iteration 8"),
Data Table("SGR Scenario Iteration 9"),
Data Table("SGR Scenario Iteration 10"),
Output Table("SGR Scenario Combined Iterations")
);
// close original iteration tables
i = 1;
While(i <= nTables,
dtIterationTable = Data Table("SGR Scenario Iteration " || Char(i));
Close(dtIterationTable);
Clear Symbols(dtIterationTable);
i++;
);<BR />내가 가진 문제는 4 단계입니다. 현재 스크립트는 10개의 데이터 테이블을 연결하도록 하드 코딩되어 있지만 연결할 수 있어야 합니다. N 동료가 데이터 세트의 크기가 변경될 때마다 JSL 코드를 편집하려고 시도해야 하는 등 10회 반복 처리에만 얽매이지 않도록 합니다(읽기: 스크립트를 변경하기 위해 나에게 옵니다). 코드에서 변수가 있음을 알 수 있습니다. n테이블 , 다른 모든 코드 블록이 처리하도록 설정되어 있으므로 열린 데이터 테이블 수의 수입니다. N 데이터 테이블.
이 문제에 대한 도움을 주시면 대단히 감사하겠습니다.
데이터 혼합 및 정리Re: JSL에서 n개의 데이터 테이블을 어떻게 동적으로 연결합니까?귀하가 제안한 솔루션에 대해 약간의 정리 작업을 수행해야 했지만 기본적으로 작동했습니다. 내 스크립트의 프런트 엔드에 대한 업데이트된 코드는 다음과 같습니다.
Names Default to Here(1);
Delete Symbols();
//----------------------------------------------------------------------------------------------
// Select file path, then import and combine all iteration data tables into a single data table
// of replicates of sorties completed by te hour across iterations.
//----------------------------------------------------------------------------------------------
path = Pick Directory("Select the directory containing the iteration files.");
iterationFile = path || "SGR Scenario Iteration 1.jmp";
dtIterationTables = Open(iterationFile, "Invisible");
dtIterationTables << Set Name("SGR Scenario Combined Iterations");
// add Iteration column
dtIterationTables << New Column(
"Iteration",
Ordinal,
Set Each Value(1)
);
dtIterationTables << Move Selected Columns(
{"Iteration"},
After(:Time of Day)
);
// get remaining iteration tables
i = 2;
iterationFile = path || "SGR Scenario Iteration " || Char(i) || ".jmp";
While(File Exists(iterationFile),
dtIterationFile = Open(iterationFile, "Invisible");
// add Iteration column
dtIterationFile << New Column(
"Iteration",
Ordinal,
Set Each Value(i)
);
// append current iteration table to combined table
dtIterationTables = dtIterationTables << Concatenate(
dtIterationFile,
Append to first table(1)
);
Close(dtIterationFile, NoSave);
//look for next iteration data table
i++;
iterationFile = path || "SGR Scenario Iteration " || Char(i) || ".jmp";
);
//----------------------------------------------------------------------------------------------
// Add Replicate column and then create data table with simplified statistical model.
//----------------------------------------------------------------------------------------------
dtIterationTables << New Column(
"Replicate",
Ordinal,
Formula(Num(Right(:Time of Day, Length(:Time of Day) - Contains(:Time of Day, " "))))
);
dtIterationTables << Move Selected Columns(
{"Replicate"},
After(:Iteration)
);
// make data set more flexible by stacking the hour columns to simplify the statistical model
dtIterationTables << Stack(
columns(
:Name("1200"),
:Name("1300"),
:Name("1400"),
:Name("1500"),
:Name("1600"),
:Name("1700"),
:Name("1800"),
:Name("1900"),
:Name("2000"),
:Name("2100"),
:Name("2200")
),
Source Label Column("Hour"),
Stacked Data Column("Sorties Completed"),
Copy formula(0),
Name("Non-stacked columns")(Keep(:Iteration, :Replicate)),
Output Table("Combined SGR Scenario Iterations")
);
dtAllIterations = Data Table("Combined SGR Scenario Iterations");
Close(dtIterationTables, NoSave);
dtAllIterations:Hour << Set Modeling Type("Ordinal");
dtAllIterations << Save As(path || "Combined SGR Scenario Iterations.jmp");도와 주셔서 감사합니다!
Re: JSL에서 n개의 데이터 테이블을 어떻게 동적으로 연결합니까?아래 코드를 살펴보십시오.당신이 원하는 당신을 얻을 수 있어야 합니다.코드를 실제로 테스트할 수는 없었지만 꽤 정확하다고 생각합니다.각 파일이 입력된 후 연결을 수행하기 때문에 얼마나 많은 데이터 테이블을 읽었는지 추적할 필요가 없는 접근 방식을 취합니다.
Names Default to Here(1);
Delete Symbols();
//----------------------------------------------------------------------------------------------
// Select file path, then import and combine all iteration data tables into a single data table
// of replicates of sorties completed across iterations.
//----------------------------------------------------------------------------------------------
path = Pick Directory("Select the directory containing the iteration files.");
iterationFile = path || "SGR Scenario Iteration 1.jmp";
dtBaseIterationTables = Open(iterationFile, "Invisible");
dtBaseIterationTable << set name( "SGR Scenario Combined Iterations" );
// add Iteration column
dtBaseIterationTables << New Column(
"Iteration",
Ordinal,
Set Each Value(1)
);
dtBaseIterationTables << Move Selected Columns(
{"Iteration"},
After(:Time of Day)
);
// get remaining iteration tables
i = 2;
//iterationFile = path || "SGR Scenario Iteration 2.jmp";
While(File Exists(path || "SGR Scenario Iteration " || char( i ) || ".jmp";),
//nTables = i;
dtIterationFile = Open(path || "SGR Scenario Iteration " || char( i ) || ".jmp", "Invisible");
// add Iteration column
dtIterationFile << New Column(
"Iteration",
Ordinal,
Set Each Value(i)
);
/* // Not required since the columns from this table will align with the base table
dtIterationFile << Move Selected Columns(
{"Iteration"},
After(:Time of Day)
)*/;
//look for next iteration table
i++;
// iterationFile = path || "SGR Scenario Iteration " || Char(i) || ".jmp";
dtBaseIterationTables = dtBaseIterationTables << Concatenate( dtIterationFile, append to first table( 1 ) );
close( dtIterationFile, nosave );
);<BR /><BR />dtBaseIterationTables << Show Window( 1 );
/*// concatenate current interation table to first iteration table
// NOTE: AWAITING RESPONSE ON HOW TO MAKE THIS PROCESS DYNAMIC
Data Table("SGR Scenario Iteration 1") << Concatenate(
Data Table("SGR Scenario Iteration 2"),
Data Table("SGR Scenario Iteration 3"),
Data Table("SGR Scenario Iteration 4"),
Data Table("SGR Scenario Iteration 5"),
Data Table("SGR Scenario Iteration 6"),
Data Table("SGR Scenario Iteration 7"),
Data Table("SGR Scenario Iteration 8"),
Data Table("SGR Scenario Iteration 9"),
Data Table("SGR Scenario Iteration 10"),
Output Table("SGR Scenario Combined Iterations")
);
// close original iteration tables
i = 1;
While(i <= nTables,
dtIterationTable = Data Table("SGR Scenario Iteration " || Char(i));
Close(dtIterationTable);
Clear Symbols(dtIterationTable);
i++;
);*/