Iterazione di un array associativo utilizzando un ciclo For con una condizione Empty While non funzionanteHo ricevuto consigli in gran parte da Ciclo attraverso gli elementi di un array associativo su come scorrere gli array associativi. La mia comprensione è che l'iteratore itera sulle chiavi, non sui valori, ma che puoi facilmente accedere ai valori che hai l'array.
Il mio codice è sotto.
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 essere valutata su True finché 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: {} valuta True o False in Is Empty()? Non riesco nemmeno a cercarlo su Google perché {} sono caratteri speciali che Google non elabora. Quindi puoi capire perché sono confuso.
Ho già codificato 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 JSL di JMP, le cose stanno diventando più chiare, cosa di cui sono grato. Grazie a tutti per il vostro aiuto!
Mike
Accesso ai datiRe: Iterazione attraverso un array associativo utilizzando un ciclo For con una condizione Empty While non funzionanteEcco alcuni dati anonimi (in allegato), in formato CSV, incluse le relative colonne ID, Data e poche altre che mi interessa utilizzare.
Fammi sapere se questo aiuta o no. Sono disposto a continuare il dialogo per aiutare a trovare la risposta a questa domanda.
Mike
Re: Iterazione attraverso un array associativo utilizzando un ciclo For con una condizione Empty While non funzionanteSì, dammi un momento. Dovrò rendere anonimi tutti i dati e gli identificatori molto velocemente...
Mike
Re: Iterazione attraverso un array associativo utilizzando un ciclo For con una condizione Empty While non funzionanteRiceverai il messaggio di errore di ambito se la tua variabile e il nome della colonna sono gli stessi.Ad esempio, hai una colonna e una variabile denominata ID.Anche query_date.
Mantieni i nomi delle colonne (più facile) e modifica i nomi delle variabili.Ad esempio :ID e one_id, :query_date e one_query_date.
Re: Iterazione attraverso un array associativo utilizzando un ciclo For con una condizione Empty While non funzionantepuoi fornire una tabella di dati di esempio?Re: 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 theRows sta funzionando, e non sembra che stiamo andando così lontano, però. Stampa:
[](0, 1)
dove dovrebbe stampare una riga molto completa (verso l'alto di 20 colonne) dalla tabella 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 è per questo che sto lottando anch'io.
Grazie in anticipo,
Mike
Re: Iterazione attraverso un array associativo utilizzando un ciclo For con una condizione Empty While non funzionanteOK ...... stavo indovinando.Hai indicato che dovevi trovare query_date e sembrava che avesse a che fare con Select Where().Quindi ho indovinato che nella tua tabella di dati c'è una colonna chiamata query_date, e Select Where() o Get Rows Where(), restituirebbe la riga che ha la data della query desiderata.E a quanto pare ho indovinato dove si può trovare la data della query.
Re: Iterazione attraverso un array associativo utilizzando un ciclo For con una condizione Empty While non funzionanteCiao Craig. Questo sembra funzionare. Grazie mille.
Michael
Re: Iterazione attraverso un array associativo utilizzando un ciclo For con una condizione Empty While non funzionanteGrazie per la risposta, Jim. Una cosa: non capisco
query_date = dt1:query_date[ theRows[1] ];
poiché query_date non è ancora stato istanziato.
È un errore di battitura (dovrebbe essere una variabile diversa)?
Il registro genera anche 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 capirei da solo, ma questo problema si sta rivelando sorprendentemente impegnativo, quindi non ne sono del tutto sicuro.
Grazie mille,
Mike
Re: Iterazione attraverso un array associativo utilizzando un ciclo For con una condizione Empty While non funzionanteGrazie 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.
MikeRe: Iterazione attraverso un array associativo utilizzando un ciclo For con una condizione Empty While non funzionanteNon capisco perché stai usando un array associativo?Puoi espandere ciò che stai immaginando 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 a cui si fa riferimento e uno 0 quando l'elemento a cui si fa 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
Per quanto riguarda
query_date = dt1 << Select Where (:"ID" == ID);
Il Select Where() esegue un'azione, ma non restituisce nulla.Pertanto query_date non ha valore.Ciò che fa Select Where() è impostare lo stato della riga selezionata su "On" per tutte le righe nella tabella di 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, devi 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, consisterebbe nell'usare Get Rows Where().
query_date = dt1:query_date[ dt1 << get rows where( :ID == ID )[1] ];
Spero di essere d'aiuto e di non creare confusione.Per favore continua a fare le tue domande.
Re: Iterazione attraverso un array associativo utilizzando un ciclo For con una condizione Empty While non funzionanteLa 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 <<
IL ! è il non operatore.
modifica: potresti volere qualcosa del genere
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
key=Val2 non ha elementi
key=Val3 ha 3 elementi