Aprire 25 tabelle, Sommario per ciascuna e concatenare tutte le tabelle di riepilogo.Ciao,
Sono un nuovo utente JMP e sto provando a eseguire alcune manipolazioni automatiche dei dati con JSL. Come il titolo descritto, ho bisogno di
Per (i = 1, i <= Nitems ("directory"), i ++,
1) Aprire uno dei 25 tavoli;
2) Generare una tabella riassuntiva della tabella aperta;
);
3) Dopo aver eseguito il ciclo di tutte le 25 tabelle, generare una tabella concatenata di 25 tabelle di riepilogo.
Ho fatto la 1a e la 2a parte e li ho fatti in loop. Ma non sono sicuro di come concatenare automaticamente le tabelle di riepilogo risultanti. Ora li concatenamento manualmente dopo che tutte le tabelle sono state generate.
La mancanza della conoscenza è come nominare ogni tabella riassuntiva e fare riferimento a loro quando è necessario concatenarli.
Inoltre, sarebbe bello se lo script potesse chiudere tutte le tabelle aperte (dalla parte 1) e le tabelle di riepilogo (dalla parte 2)), restituire solo la tabella concatenata. (Con la mia sceneggiatura, salterebbe fuori 50 tavoli in totale, e devo chiuderli manualmente.)
Allegati i miei script:
Imposta la directory predefinita ("E: \ Test");
files = file nella directory ("E: \ Test");
Per (i = 1, i <= N Items (file), i ++,
Aperto(
file [i],
Fogli di lavoro ("foglio di lavoro1"),
Utilizzare per tutti i fogli (1),
Fogli di lavoro concatenati (0),
Crea colonna di concatenazione (0),
Impostazioni del foglio di lavoro (
1,
Ha le intestazioni delle colonne (1),
Numero di righe nelle intestazioni (1),
Intestazioni Inizio riga (1),
Dati inizia sulla riga (2),
Dati inizia sulla colonna (1),
Data Ends on Row (0),
Fine dati su colonna (0),
Righe replicate replicate (1),
Intestazioni con spanning replicate (0),
Elimina righe nascoste (1),
Elimina le colonne nascoste (1),
Elimina colonne vuote (1),
Tratta come gerarchia (0),
Stack di più serie (0),
Importa colori celle (0),
Limit Column Detect (0),
Column Separator String ("-")
)
);
Nuova colonna ("Xindex", Formula (Ceiling (: Name ("X") /: Name ("dimensioneX"))));
Nuova colonna ("Yindex", Formula (Floor (: Name ("Y") / : Nome ( "dimensionY") )));
Sommario(
Gruppo(
: Nome ("X"),
: Nome ("Y"),
: Xindex,
: Yindex),
Dev Dev (: Nome ("Dati1")),
Freq ("Nessuno"),
Peso ("Nessuno")
)
);
Ri: Aprire 25 tabelle, Sommario per ciascuna, e Concatenare tutte le tabelle di riepilogo.Nel codice, si specifica
dtConcat = dtSum;
Quello che credo sia il tuo processo mentale è che stai facendo una copia della tabella dati quando usi questa affermazione. Ma infatti dtConcat e dtSum sono solo variabili, che contengono un puntatore a una tabella di dati e, specificando dtConcat come uguale a dtSum, entrambe le variabili puntano alla stessa tabella di dati.
E poi tu specifichi
close (dtSum,nosave);
Ciò chiude la tabella di dati a cui punta la variabile dtSum. Ciò significa che ora dtSum e dtConcat non hanno più una tabella di dati aperta a cui puntano.
Ri: Aprire 25 tabelle, Sommario per ciascuna, e Concatenare tutte le tabelle di riepilogo.Ciao Uday,
Molte grazie! Penso che il tuo script mi dica come usare il punto e virgola e virgola in if (): la virgola è usata per separare test ed expr, il punto e virgola è usato per unire più argomenti in un solo expr. È corretto?
@txnelson
Ciao Jim,
Se sono corretto sull'uso della virgola e del punto e virgola, prevedo che il seguente script dovrebbe funzionare aggiungendo la linea evidenziata.
Tuttavia, con questo nuovo script, ho ottenuto dt e dtSum solo quando i = 2 (ho aggiunto un'altra colonna in tutte le tabelle per tenere traccia di "i" nella tabella corrente).
Senza la linea evidenziata, ho dt e dtSum quando i = 1, e dtConcat quando for () viene eseguito, proprio come ho descritto nella mia ultima risposta a te.
if(i == 1,
dtConcat = dtSum<FONT color="#FF6600"><STRONG>; close(dtSum,nosave);close(dt,nosave);</STRONG></FONT>,
dtConcat = dtConcat << Concatenate(dtSum,"Append to first table");close(dtSum,nosave);Close(dt,nosave);
);
Ri: Aprire 25 tabelle, Sommario per ciascuna, e Concatenare tutte le tabelle di riepilogo.Ciao Jim,
Molte grazie! Ora ho capito di usare i riferimenti in JMP.
Un'altra domanda per la funzione if (). Nella seguente funzione if () che ho aggiunto nel mio script, i == 1 è test 1, dtConcat = dtSum è expr1, e il resto "dtConcat = dtConcat << ......." è "else expr".
La mia domanda è: come posso aggiungere più espressioni per il test 1 in if ()? Nel primo script, ora ho tre tabelle in uscita,
1) dt quando i == 1;
2) dtSum quando i == 1;
3) dtConcat quando viene eseguito il ciclo for (), che è esattamente ciò di cui ho bisogno.
Ora voglio solo non segnalare 1) e 2) dopo aver eseguito lo script, solo report 3).
Ho provato il secondo script ma non funziona. Inoltre, entrambi gli script forniscono avvisi "Impossibile aggiungere a una tabella di dati bloccata o derivata".
if(i == 1,
dtConcat = dtSum,
dtConcat = dtConcat << Concatenate(dtSum,"Append to first table");close(dtSum,nosave);Close(dt,nosave)
);
Nel secondo script, ho provato a 1) quando ho == 1, assegna dtSum a dtConcat e chiudi dtSum e dt; 2) quando i non è uguale a 1, Concat dtSum to dtConcat e chiudi dtSum e dt. Tuttavia, non funziona come mi aspettavo. Suppongo che sia perché sto usando virgola e punto e virgola in modo sbagliato?
if(i == 1,
dtConcat = dtSum; close (dtSum,nosave); close (dt, nosave),
dtConcat = dtConcat << Concatenate(dtSum,"Append to first table");close(dtSum,nosave);Close(dt,nosave)
);
Ri: Aprire 25 tabelle, Sommario per ciascuna, e Concatenare tutte le tabelle di riepilogo.Hai solo bisogno di aggiungere un passaggio di concatenazione al tuo codice ...... qualcosa del genere
Set Default Directory( "E:\Test" );
files = Files In Directory( "E:\Test" );
For( i = 1, i <= N Items( files ), i++,
dt = Open(
files[i],
Worksheets( "worksheet1" ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 1 ),
Data Starts on Row( 2 ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
)
);
New Column( "Xindex", Formula( Ceiling( :Name( "X" ) / :Name( "dimensionX" ) ) ) );
New Column( "Yindex", Formula( Floor( :Name( "Y" ) / :Name( "dimensionY" ) ) ) );
dtSum = dt << Summary(
Group( :Name( "X" ), :Name( "Y" ), :Xindex, :Yindex ),
Std Dev( :Name( "Data1" ) ),
Freq( "None" ),
Weight( "None" );
If( i == 1,
dtConcat = dtSum,
dtConcat = dtConcat << concatenate( dtSum, append to first table );
Close( dtSum, nosave );
);
);
);
Ri: Aprire 25 tabelle, Sommario per ciascuna, e Concatenare tutte le tabelle di riepilogo. @Zihao ,
Quando apri una tabella di dati in JMP, un modo per catturare un riferimento è fare qualcosa del genere:
dt = Open(<YOUR custom="" path="">);</YOUR>
Ora, dt detiene il riferimento alla tabella dati a cui è possibile passare messaggi e comandi di emissione. Ora un altro modo per passare i messaggi a una tabella di dati è se si conosce il nome della tabella di dati
Data Table("Big Class") // This is an example Come per la tua domanda su come concatenare le tabelle di dati, potresti usare il seguente modello:
for(i = 1, i <= N Items(files), i++,
dt = Open(<CUSTOM script="" here="">);
If(i == 1,
dt_Results = New Table("Results");
dt_Results = dt;
,
dt_Results << Concatenate(dt,"Append To First Table");
);
);</CUSTOM>