Ricerca colonna utilizzando l'elenco di stringhe parzialiSto cercando di ottenere righe in cui il valore ha una corrispondenza da un elenco definito di stringhe parziali. Esempio sotto.
La stringa parziale che mi interessa è "aaa" o "aa bb". Ho iniziato con il JSL di seguito. Idealmente, il risultato è [1,2,4,5,7,8,11]. Lo script seguente è stato in grado di ottenere tutto tranne l'ultimo (11). Tuttavia, forse ci sono anche soluzioni più eleganti di quelle che ho io. Apprezzo l'aiuto!

names default to here(1);
keys_list = {"aaa", "aa bb"};
dt = current data table();
Row_list = dt <<GET rows="" where=""></GET>SceneggiaturaRe: ricerca colonna utilizzando l'elenco di stringa parzialeMolto probabilmente userei la regex regolare qui con qualcosa del genere. Se diventa troppo lento, allora forse inizierei a pensare a qualcosa di più complicato
Names Default To Here(1);
keys_list = {"aaa", "aa bb"};
dt = Current Data Table();
regex_pattern = "(" || Concat Items(keys_list, "|") || ")";
row_list = [];
For Each Row(dt,
If(!IsMissing(Regex(lowercase(:TEST), regex_pattern)),
Insert Into(row_list, Row())
);
);
show(row_list); //row_list = [1, 2, 4, 5, 7, 8, 11];Re: ricerca colonna utilizzando l'elenco di stringa parzialeEcco il mio approccio per risolvere questo problema
names default to here(1);
keys_list = {"aaa", "aa bb"};
dt = current data table();
row_list=[];
For( i = 1, i <= N Rows( dt ), i++,
For( k = 1, k <= N Items( keys_list ), k++,
If( Contains( :test[i], keys_list[k] ),
row_list = row_list || Matrix( i );
Break();
)
)
);
show(sort ascending(Row_list));Re: ricerca colonna utilizzando l'elenco di stringa parziale@jthi , @txnelson , @vince_faller Grazie per le soluzioni! In realtà ho dimenticato di menzionare un altro scenario. Il secondo elemento nella keys_list è "aa bb" che è costituito da due parole separate da uno spazio delimitatore. Nel set di dati su cui sto lavorando, potrebbero esserci casi in cui il delimitatore è costituito da altri caratteri speciali. Ad esempio, se c'è una dodicesima riga con un valore di "aa-bb", vorrei che anche quella riga fosse chiamata, il che porta al risultato finale di [1,2,4,5,7,8,11 ,12].
Come devo aggiornare gli script per tenere conto anche di questo? Immagino che dovrebbe esserci un passaggio che sostituisce tutto il modello di delimitatore in keys_list con un codice regex per caratteri speciali?
Re: ricerca colonna utilizzando l'elenco di stringa parzialePenso che lo farei esattamente come dici tu, scorrendo il keys_list o semplicemente inserendoli lì con il carattere "wild" della carta (in caso di regex . dovrebbe funzionare). Modifica: utilizzando . potrebbe corrispondere a troppi caratteri diversi, quindi è molto probabile che venga creata una stringa che abbia tutte le stringhe consentite . Un'altra fonte per regex regex101
Names Default To Here(1);
keys_list = {"aaa", "aa bb"};
new_keys_list = Transform Each({new_key}, keys_list, Substitute(new_key, " ", "."));
dt = Current Data Table();
regex_pattern = "(" || Concat Items(new_keys_list, "|") || ")";
row_list = [];
For Each Row(dt,
If(!IsMissing(Regex(lowercase(:TEST), regex_pattern)),
Insert Into(row_list, Row())
);
);
show(row_list); //row_list = [1, 2, 4, 5, 7, 8, 11];
@vince_faller Penso di ricordare di aver visto qualcosa al riguardo, ma non sono più sicuro in quale caso fosse e quale funzione, almeno con JMP16 IsMissing() funziona con le stringhe. Forse è stato con confronti come "a" == ., poiché genererà un errore:

Re: ricerca colonna utilizzando l'elenco di stringa parzialeGrazie @jthi !
regex101 è una risorsa fantastica!
Re: ricerca colonna utilizzando l'elenco di stringa parzialeSe vuoi farlo in una formula di colonna
Names default to here(1);
dt = current data table();
dt << Add Rows({:Test = "aa-bb"});
dt << New Column("Match", Formula(isstring(Regex(:TEST, "(aaa)|(aa.bb)", "\0", IGNORECASE))));
dt << Run Formulas(); // just to make sure the formula runs
match_rows = loc(dt:Match << Get Values());
dt << Delete Columns(:Match);
show(match_rows); // match_rows = [1, 2, 4, 5, 7, 8, 11];
Ecco un risorsa regolare Mi piace se non lo conosci molto bene.
Anche @jthi `ismissing()` non funzionava sulle stringhe?Ricordo che uccideva sempre le mie espressioni regolari (quindi perché ho usato `isstring()` qui).Anche se l'ho provato fino alla 14.3 e sembra andare bene.
*Modifica* ha creato il carattere jolly.
Re: ricerca colonna utilizzando l'elenco di stringa parzialeHo aggiornato il mio script per adattarsi a questo.È solo un carattere jolly `.`. Potresti voler essere più specifico sul tuo carattere jolly.Di solito non è il massimo consentire qualsiasi cosa.Soprattutto se non è quello che vuoi veramente.