Ricerca di colonne 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 di seguito.
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>Automazione e scriptingRi: Ricerca di colonne utilizzando l'elenco di stringhe parzialiHo aggiornato il mio script per adattarlo.È solo un carattere jolly "." Potresti voler essere più specifico riguardo al tuo carattere jolly.Di solito non è la cosa migliore permettere semplicemente qualcosa.Soprattutto se non è quello che vuoi veramente.
Ri: Ricerca di colonne utilizzando l'elenco di stringhe parzialiGrazie @jthi !
regex101 è una risorsa fantastica!
Ri: Ricerca di colonne utilizzando l'elenco di stringhe parzialiPenso che lo farei esattamente come dici tu, o loop over keys_list o semplicemente inserirli lì con il carattere "jolly" (in caso di regex . dovrebbe funzionare). Modifica: utilizzando . potrebbe contenere troppi caratteri diversi, quindi è molto probabile che sia meglio creare una stringa che contenga tutte le stringhe consentite . Un'altra fonte per le espressioni regolari 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 a riguardo, ma non sono più sicuro in quale caso fosse e quale funzione, almeno con JMP16 IsMissing() funziona con le stringhe. Forse era con confronti come "a" == ., poiché genererebbe un errore:

Ri: Ricerca di colonne utilizzando l'elenco di stringhe parziali@jthi , @txnelson , @vince_faller Grazie per le soluzioni! In realtà ho dimenticato di menzionare un altro scenario. Il secondo elemento in keys_list è "aa bb", ovvero 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 "aa-bb", vorrei che anche quella riga venisse chiamata, il che porta al risultato finale di [1,2,4,5,7,8,11 ,12].
Come dovrei aggiornare gli script per tenere conto anche di questo? Immagino che dovrebbe esserci un passaggio che sostituisce tutti i pattern delimitatori in keys_list con un codice regex per caratteri speciali?
Ri: Ricerca di colonne utilizzando l'elenco di stringhe parziali@jthi , @txnelson , @vince_faller Grazie per le soluzioni!
In realtà ho dimenticato di menzionare un altro scenario. Il secondo elemento in keys_list è "aa bb", ovvero 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 "aa-bb", vorrei che anche quella riga venisse chiamata, il che porta al risultato finale di [1,2,4,5,7,8,11 ,12].
Come dovrei aggiornare gli script per tenere conto anche di questo? Immagino che dovrebbe esserci un passaggio che sostituisce tutti i pattern delimitatori in keys_list con un codice regex per caratteri speciali?
Ri: Ricerca di colonne utilizzando l'elenco di stringhe parziali@jthi , @vince_faller , @txnelson . Grazie! Queste sono ottime soluzioni!
In realtà, ho dimenticato di includere un altro scenario che potrei vedere nei dati su cui sto lavorando. Il secondo elemento in keys_list è "aa bb", ovvero due parole separate da un delimitatore di spazio. Nel mio set di dati potrebbero esserci casi in cui le parole sono separate da altri caratteri speciali, ma mi piacerebbe comunque includerle. Ad esempio, se c'è una dodicesima riga con un valore "aa-bb", vorrei che venisse richiamata anche quella, quindi il risultato finale sarà [1,2,4,5,7,8,11,12 ]
Come faresti per aggiornare gli script per adattarli? Immagino che ci sia un passaggio in cui tutti i delimitatori in keys_list vengono sostituiti con un codice speciale per caratteri speciali che possono essere riconosciuti in un modello da regex?
Grazie per l'aiuto!
Ri: Ricerca di colonne utilizzando l'elenco di stringhe parzialiSe 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 regex Mi piace se non lo conosci molto bene.
Anche @jthi `missing()` non funzionava sulle stringhe?Ricordo che uccideva sempre le mie espressioni regolari (ecco perché ho usato `isstring()` qui).Anche se l'ho provato fino alla 14.3 e sembra che vada bene.
*Modifica* ha creato il carattere jolly.
Ri: Ricerca di colonne utilizzando l'elenco di stringhe parzialiEcco 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));Ri: Ricerca di colonne utilizzando l'elenco di stringhe parzialiMolto probabilmente utilizzerei l'espressione regolare regolare qui con qualcosa del genere. Se diventasse troppo lento, 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];