Converti array in stringaCiao a tutti,
Sto cercando di ottenere un valore da un array da un'altra tabella e utilizzarlo come valore per la mia selezione. C'è un modo per convertire l'array in una stringa?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(:Name_final==name_key);
Tabella datiAltroScriptingRe: Converti array in stringaPenso che questo ti darà quello che vuoi
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(nrows(loc(name_key,:Name_final))>0);
Re: Converti array in stringaDi nuovo, stupito dalla capacità di Jim di arrivare al cuore della domanda. Due bei frammenti di codice qui meritano una spiegazione più lunga:
Cosa fa questo?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
ref_file_1 è un riferimento a una tabella di dati, "NOME" è il nome di una colonna come stringa (letteralmente, "NAME", ma potrebbe essere in una variabile), e il and colonna la funzione restituisce un riferimento di colonna. Il < message ottiene tutti i valori dalla colonna, inclusi i duplicati. Il array associativo la funzione crea un insieme di valori univoci e la funzione < messaggio restituisce i valori univoci. (Ben fatto @jshvt17 .)
e questo?
merged_file << select where(nrows(loc(name_key,:Name_final))>0);
Il < messaggio opera su ogni riga del file_unito , uno alla volta e seleziona le righe quando l'argomento è diverso da zero.
Il loc() la funzione restituisce una matrice di indici. Cerca l'elenco in nome_chiave per le occorrenze di :Name_final. La matrice risultante può avere zero o più righe, anche se in questo esempio avrà 0 o 1 riga perché le chiavi sono univoche. Il righe() la funzione restituisce 0 o 1 che viene quindi confrontata >0 e rimane 0 o 1. Quindi le righe sono selezionate se :Name_final è nell'elenco di ref_file_1:NAME.
Alternativa:
E se ci fossero >1e6 nomi in name_key e >1e7 righe in merge_file? Come sarebbe lo spettacolo? La funzione loc cercherà molto. Confronterà le stringhe 1e13. Ti stancherai di aspettare. La soluzione per questo è usare l'array associativo in questo modo:
nameSet = associative array(column(ref_file_1, "NAME") << get values);
merged_file << select where(contains(nameSet, :Name_final));
Ora ci sono solo 1e7 ricerche in nameSet. Non sono gratuiti, ma sono molto più veloci rispetto al controllo sequenziale degli elementi 1e6. Suppongo che circa 20 confronti ciascuno (log2(1e6)). Questo potrebbe anche essere più facile da seguire per il prossimo manutentore.
(Non testato. Correzioni benvenute!)
Re: Converti array in stringaCraige,
Ancora una volta ho imparato qualcosa di nuovo su JMP.Inizialmente avevo scritto il codice usando una funzione Contiene(), ma poi mi sono convertito all'uso della funzione Loc(), perché quello che pensavo sarebbe stato un problema in cui
Contains( "BARBARA ANN", "BARBARA")
restituisce Vero.
Avevo (erroneamente si scopre) che se il componente di confronto di Contiene è un elenco di elementi JMP,
Contains( {"BARBARA ANN", "BETTY", "DAVID"}, "BARBARA")
restituirebbe anche True, tuttavia restituisce False, il che significa che esegue una corrispondenza assoluta.
Grazie per le ottime informazioni