Come concatenare dinamicamente n tabelle di dati in JSLSto creando uno script per automatizzare il flusso di lavoro per un collega che è un utente alle prime armi di JMP. La prima operazione dello script consiste nel combinare tutte le iterazioni dei dati dalle esecuzioni del modello. Questo è realizzato da,
- All'utente viene richiesto di selezionare la directory delle singole tabelle di dati che rappresentano N iterazioni di un'esecuzione del modello.
- Lo script apre tutte le tabelle di dati di iterazione che hanno un nome predefinito seguito dal numero di iterazione: “SGR Scenaio Iteration i”.
- All'apertura di ogni tabella di dati di iterazione, viene aggiunta una colonna Iterazione e precompilata con il numero di iterazione.
- Dopo che tutte le tabelle di dati sono state aperte, le tabelle di dati da 2 a 10 vengono concatenate alla prima tabella di dati, per creare una nuova tabella di dati combinata denominata "SGR Scenario Combined Iterations".
- Le iterazioni originali vengono quindi chiuse senza essere salvate; questo è progettato per preservare le tabelle di dati originali.
Ecco il codice per la prima parte dello script che esegue le attività sopra elencate:
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 />Il problema che ho è con il passaggio 4. Lo script corrente è codificato per concatenare 10 tabelle di dati, ma devo essere in grado di concatenare N tabelle di dati in modo che il mio collega non sia bloccato solo nell'elaborazione di 10 iterazioni, o peggio, dovendo tentare di modificare il codice JSL ogni volta che la dimensione del set di dati cambia (leggi: viene da me per cambiare lo script). Puoi vedere nel codice che ho una variabile, nTabelle , ovvero il conteggio del numero di tabelle di dati che sono state aperte, poiché ogni altro blocco di codice è impostato per la gestione N tabelle di dati.
Tutta l'assistenza su questa materia notevolmente sarebbe apprezzata.
Miscelazione e pulizia dei datiRi: Come concatenare dinamicamente n tabelle di dati in JSLHo dovuto fare un po 'di pulizia sulla soluzione suggerita, ma ha funzionato sostanzialmente. Ecco il codice aggiornato per il front-end del mio script:
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");Grazie per l'aiuto!
Ri: Come concatenare dinamicamente n tabelle di dati in JSLDai un'occhiata al codice qui sotto.Dovrei farti quello che vuoi.Non ho potuto davvero testare il codice, ma credo che sia abbastanza accurato.Prende l'approccio di non dover tenere traccia di quante tabelle di dati sono state lette, poiché esegue la concatenazione dopo l'inserimento di ogni file.
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++;
);*/