Recherche de colonne à l'aide de la liste de chaînes partiellesJ'essaie d'obtenir des lignes où la valeur correspond à une liste définie de chaînes partielles. Exemple ci-dessous.
La chaîne partielle qui m'intéresse est soit "aaa" soit "aa bb". J'ai commencé avec le JSL ci-dessous. Idéalement, le résultat est [1,2,4,5,7,8,11]. Le script ci-dessous a pu tout récupérer sauf le dernier (11). Néanmoins, il existe peut-être des solutions plus élégantes que celles que j'ai également. Appréciez l'aide !

names default to here(1);
keys_list = {"aaa", "aa bb"};
dt = current data table();
Row_list = dt <<GET rows="" where=""></GET>ScriptRe : Recherche de colonne à l'aide d'une liste de chaînes partiellesJ'utiliserais très probablement des regex régulières ici avec quelque chose comme ça. Si ça devient trop lent, alors je commencerais peut-être à penser à quelque chose de plus compliqué
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 : Recherche de colonne à l'aide d'une liste de chaînes partiellesVoici mon approche pour résoudre ce problème
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 : Recherche de colonne à l'aide d'une liste de chaînes partielles@jthi , @txnelson , @vince_faller Merci pour les solutions ! En fait, j'ai oublié de mentionner un autre scénario. Le deuxième élément de la keys_list est "aa bb" qui est deux mots séparés par un délimiteur d'espace. Dans l'ensemble de données sur lequel je travaille, il pourrait y avoir des cas où le délimiteur est d'autres caractères spéciaux. Par exemple, s'il y a une 12ème ligne avec une valeur de "aa-bb", j'aimerais que cette ligne soit également appelée, ce qui conduit au résultat final de [1,2,4,5,7,8,11 ,12].
Comment dois-je mettre à jour les scripts pour tenir compte de cela également ? Je suppose qu'il devrait y avoir une étape qui remplace tous les modèles de délimiteurs dans keys_list par un code regex pour les caractères spéciaux ?
Re : Recherche de colonne à l'aide d'une liste de chaînes partiellesJe pense que je le ferais exactement comme vous le dites, soit en boucle sur la keys_list, soit en les saisissant simplement avec un caractère de carte "wild" (en cas de regex . devrait fonctionner). Éditer : en utilisant . peut correspondre à trop de caractères différents, il est donc préférable de créer une chaîne contenant toutes les chaînes autorisées . Une autre source pour 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 Je pense que je me souviens avoir vu quelque chose à ce sujet, mais je ne sais plus dans quel cas c'était et quelle fonction, au moins avec JMP16, IsMissing() fonctionne avec des chaînes. C'était peut-être avec des comparaisons comme "a" == ., car cela générerait une erreur :

Re : Recherche de colonne à l'aide d'une liste de chaînes partiellesMerci @jthi !
regex101 est une ressource fantastique!
Re : Recherche de colonne à l'aide d'une liste de chaînes partiellesSi vous voulez le faire dans une formule de colonne
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];
Voici un ressource d'expression régulière J'aime si vous ne le savez pas très bien.
Également @jthi `ismissing()` n'était-il pas utilisé pour travailler sur les chaînes ?Je me souviens qu'il tuait toujours mes expressions régulières (c'est pourquoi j'ai utilisé `isstring()` ici).Bien que je l'ai essayé jusqu'à 14.3 et cela semble aller bien.
*Modifier* a créé le joker.
Re : Recherche de colonne à l'aide d'une liste de chaînes partiellesJ'ai mis à jour mon script pour tenir compte de cela.C'est juste un joker `.`. Vous voudrez peut-être être plus précis sur votre caractère générique.Il n'est généralement pas préférable de tout autoriser.Surtout si ce n'est pas ce que vous voulez vraiment.