Iterazione attraverso un array associativo utilizzando un ciclo For con una condizione vuota mentre non funzionaHo ricevuto consigli soprattutto da https://community.jmp.com/t5/JSL-Cookbook/Looping-through-an-Associative-Array-s-elements/tac-p/381693#M112 su come iterare attraverso array associativi. La mia comprensione è che l'iteratore itera sulle chiavi, non sui valori, ma che puoi accedere facilmente ai valori che hai l'array.
Il mio codice è di seguito.
Names Default To Here(1);
dt1 = Open("file path" );
dt2 = Open("file path 2");
Summarize(dt1, IDs = by(:ID)); //this finds all the unique IDs in the data file, which we will need
//First, populate the temporary data structure--associative array--from the dt1 data file which we will then copy over to the dt2 data file.
For (i=1, i<=N Items(IDs), i++,
ID = IDs[i];
temp_array = Associative Array ({"Val1","Val2","Val3"},{{},{},{}});
For ( temp = temp_array << First, Is Empty(temp_array[temp]), temp = temp_array << Next(temp),//looping through temp_array's keys is clunky but done this way in JMP
query_date = dt1 << Select Where (:"ID" == ID);
Write(query_date);
//etc not there yet because the above not working
);
);
La variabile di interesse a questo punto del mio viaggio è query_date, che devo procedere.Il problema è che, come è scritto, il ciclo interno non viene eseguito nemmeno una volta per qualche motivo. La condizione while nel ciclo dovrebbe restituire True fino a quando non voglio che il ciclo termini, quindi l'ho impostato su
Is Empty(temp_array[temp])
perché temp_array [temp] è il primo valore nell'array associativo, dove temp è la prima chiave, "Val1", e il valore è {}. Immagino che una domanda importante sia: {} restituisce True o False in Is Empty ()? Non posso nemmeno cercarlo su Google perché {} sono caratteri speciali che Google non elabora. Quindi puoi capire perché sono confuso.
Ho già programmato il resto del mio script e sono abbastanza fiducioso che funzionerà con errori minori a questo punto, quindi se riesco a superare questo ostacolo sarebbe di grande aiuto. Lo pseudocodice è molto chiaro nella mia mente e, come nuovo utente JMP JSL, le cose stanno diventando più chiare, cosa di cui sono grato. Grazie a tutti per il vostro aiuto!
Mike
Tabella datiScriptingRi: Iterazione attraverso un array associativo utilizzando un ciclo For con una condizione vuota mentre non funzionaLa condizione del ciclo for deve essere eseguita mentre la chiave non è vuota
For ( temp = temp_array << First, ! Is Empty(temp), temp = temp_array << Next(temp),
I metodi << first e << next dell'array associativo restituiscono una chiave (una stringa o un numero) o il valore speciale empty () quando non ci sono più chiavi. Quella chiave (se non è vuota) può essere utilizzata come indice dell'array associativo.
Il ! è il non operatore.
modifica: potresti volere qualcosa di simile
temp_array = Associative Array( {"Val1", "Val2", "Val3"}, {{1, 2}, {}, {3, 4, 5}} );
For( temp = temp_array << First, !Is Empty( temp ), temp = temp_array << Next( temp ),
If( N Items( temp_array[temp] ) > 0,
Write( "\!nkey=", temp, " has ", N Items( temp_array[temp] ), " elements" ),
Write( "\!nkey=", temp, " has no elements" )
)
);key = Val1 ha 2 elementi
chiave = Val2 non ha elementi
key = Val3 ha 3 elementi
Ri: Iterazione attraverso un array associativo utilizzando un ciclo For con una condizione vuota mentre non funzionaNon capisco perché stai usando un array associativo?Puoi espandere ciò che immaginavi che il ciclo che stai tentando di eseguire dovrebbe fare?
IsEmpty () è una funzione che restituisce 1 se lo script non sa quale sia l'elemento di riferimento e 0 quando l'elemento di riferimento è stato utilizzato nello script prima dell'esecuzione di IsEmpty ().
Perciò:
a={};
isEmpty(s);
// returns 0 since a has been referenced prior in the script
isEmpty(b);
// returns 1 since JMP has not seen the variable b before
Riguardo
query_date = dt1 << Select Where (:"ID" == ID);
Il Select Where () esegue un'azione, ma non restituisce nulla.Pertanto query_date non ha valore.Quello che fa Select Where () è impostare lo stato della riga selezionata su "On" per tutte le righe nella tabella dati che soddisfano i criteri di selezione.Se più di una riga nella tabella dati ha il valore di ID, verranno selezionate più righe.Forse quello che stai cercando è il valore della data della query per la riga selezionata.È possibile ottenere i numeri di riga delle righe selezionate
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
Restituisce una matrice dei numeri di riga, non uno scaler.Pertanto, per ottenere query_date, è necessario fare riferimento al pedice.
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
query_date = dt1:query_date[ theRows[1] ];
Una forma più semplice, che non richiede il passaggio di selezione, consiste nell'usare Ottieni righe dove ().
query_date = dt1:query_date[ dt1 << get rows where( :ID == ID )[1] ];
Spero di aiutare e di non confondere.Continua a porre le tue domande.
Ri: Iterazione attraverso un array associativo utilizzando un ciclo For con una condizione vuota mentre non funzionaGrazie, Jim. È stato gentile da parte tua per la rapida risposta. Lo apprezzo. Dammi un po 'di tempo per analizzare di nuovo tutto questo, è il fine settimana.
MikeRi: Iterazione attraverso un array associativo utilizzando un ciclo For con una condizione vuota mentre non funzionaGrazie per la risposta, Jim. Una cosa: non capisco
query_date = dt1:query_date[ theRows[1] ];
poiché query_date non è ancora stata istanziata.
È un errore di battitura (dovrebbe essere una variabile diversa)?
Anche il registro genera un errore qui:
Scoped data table access requires a data table column or variable in access or evaluation of 'dt_ld4:query_date' , dt_ld4:query_date/*###*/
Normalmente lo capirò da solo, ma questo problema si sta rivelando sorprendentemente impegnativo, quindi non ne sono del tutto sicuro.
Grazie mille,
Mike
Ri: Iterazione attraverso un array associativo utilizzando un ciclo For con una condizione vuota mentre non funzionaCiao Craige. Sembra funzionare. Grazie mille.
Michael
Ri: Iterazione attraverso un array associativo utilizzando un ciclo For con una condizione vuota mentre non funzionaOK ... stavo indovinando.Hai indicato che dovevi trovare query_date e sembrava che avesse a che fare con il tuo Select Where ().Quindi ho immaginato che nella tabella dei dati ci fosse una colonna chiamata query_date e Select Where () o Get Rows Where (), restituirebbero la riga con la data della query desiderata.E a quanto pare ho indovinato dove si può trovare la data della query.
Ri: Iterazione attraverso un array associativo utilizzando un ciclo For con una condizione Empty While non funzionantesto correndo
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
Write(theRows);
solo per verificare se la selezione di Righe funziona, e non sembra nemmeno che stiamo arrivando a tanto, però. Stampa:
[](0, 1)
dove dovrebbe stampare una riga molto completa (verso l'alto di 20 colonne) dalla tabella dei dati per ogni iterazione attraverso il ciclo. Non ho idea di cosa stia accadendo.
Per cercare di aiutare a rispondere alla tua domanda implicita, theRows è solo una variabile temporanea per trovare le righe che risultano dal valore della colonna ID corrispondente al valore specificato nel ciclo (potrebbero esserci più righe di questa natura a causa di più copie di ID).
Mi rendo conto che questo crea confusione ... ma è anche per questo che sto lottando.
Grazie in anticipo,
Mike