如何在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數據表,這樣我的同事就不會被鎖定只處理 10 次迭代,或者更糟糕的是,每次數據集大小發生變化時都必須嘗試編輯 JSL 代碼(閱讀:來找我更改腳本)。 你可以在代碼中看到我有一個變量, n表,這是打開的數據表數量的計數,因為每個其他代碼塊都設置為處理n數據表。
任何有關此事的幫助將不勝感激。
數據混合和清理回复:如何在 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");謝謝您的幫助!
回复:如何在 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++;
);*/