Wie verkette ich n Datentabellen in JSL dynamisch?Ich erstelle ein Skript, um den Arbeitsablauf für einen Kollegen zu automatisieren, der ein unerfahrener JMP-Benutzer ist. Die erste Operation des Skripts besteht darin, alle Dateniterationen aus Modellläufen zu kombinieren. Dies wird dadurch erreicht,
- Der Benutzer wird aufgefordert, das Verzeichnis der einzelnen Datentabellen auszuwählen, die dargestellt werden N Iterationen eines Modelllaufs.
- Das Skript öffnet alle Iterationsdatentabellen, die einen vordefinierten Namen gefolgt von der Iterationsnummer haben: „SGR Scenaio Iteration i“.
- Beim Öffnen jeder Iterationsdatentabelle wird eine Iterationsspalte hinzugefügt und mit der Iterationsnummer vorab ausgefüllt.
- Nachdem alle Datentabellen geöffnet wurden, werden die Datentabellen 2 bis 10 mit der ersten Datentabelle verkettet, um eine neue kombinierte Datentabelle mit dem Namen „SGR Scenario Combined Iterations“ zu erstellen.
- Die ursprünglichen Iterationen werden dann ohne Speicherung geschlossen; Dies ist beabsichtigt, um die ursprünglichen Datentabellen zu erhalten.
Hier ist der Code für den ersten Teil des Skripts, der die oben aufgeführten Aufgaben ausführt:
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 />Das Problem, das ich habe, ist mit Schritt 4. Das aktuelle Skript ist fest codiert, um 10 Datentabellen zu verketten, aber ich muss in der Lage sein, zu verketten N Datentabellen, damit mein Kollege nicht darauf beschränkt ist, nur 10 Iterationen zu verarbeiten, oder schlimmer noch, dass er jedes Mal versuchen muss, den JSL-Code zu bearbeiten, wenn sich die Größe des Datensatzes ändert (sprich: Es fällt mir ein, das Skript zu ändern). Sie können im Code sehen, dass ich eine Variable habe, nTabellen , das ist die Anzahl der Datentabellen, die geöffnet wurden, da jeder andere Codeblock für die Verarbeitung eingerichtet ist N Datentabellen.
Für jede Hilfe in dieser Angelegenheit wären wir sehr dankbar.
Datenmischung und -bereinigungBetreff: Wie verkette ich n Datentabellen in JSL dynamischIch musste Ihre vorgeschlagene Lösung ein wenig aufräumen, aber im Grunde hat es funktioniert. Hier ist der aktualisierte Code für das Frontend meines Skripts:
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");Danke für die Hilfe!
Betreff: Wie verkette ich n Datentabellen in JSL dynamischSchauen Sie sich den folgenden Code an.Ich sollte dafür sorgen, dass du willst.Ich konnte den Code nicht wirklich testen, aber ich glaube, dass er ziemlich genau ist.Der Ansatz besteht darin, nicht nachverfolgen zu müssen, wie viele Datentabellen eingelesen wurden, da die Verkettung nach der Eingabe jeder Datei erfolgt.
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++;
);*/