Recherche de colonne à l'aide d'une 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 obtenir sauf le dernier (11). Néanmoins, il existe peut-être aussi des solutions plus élégantes que celles que j’ai. 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>Automatisation et scriptsRe : 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 caractère générique `.`. Vous souhaiterez peut-être être plus précis sur votre caractère générique.Ce n’est généralement pas la meilleure solution d’autoriser n’importe quoi.Surtout si ce n'est pas ce que vous voulez vraiment.
Re : Recherche de colonne à l'aide d'une liste de chaînes partiellesMerci @jthi !
expression régulière101 est une ressource fantastique !
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 parcourant la liste_clés, soit en les entrant simplement ici avec le caractère "sauvage" (en cas d'expression régulière, cela devrait fonctionner). Edit : en utilisant . il peut y avoir 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 source supplémentaire de regex expression régulière101
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 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 liste_clés est "aa bb", qui est composé de deux mots séparés par un délimiteur d'espace. Dans l'ensemble de données sur lequel je travaille, il peut y avoir des cas où le délimiteur est constitué 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 mène au résultat final de [1,2,4,5,7,8,11 ,12].
Comment dois-je mettre à jour les scripts pour en tenir compte é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 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 liste_clés est "aa bb", qui est composé de deux mots séparés par un délimiteur d'espace. Dans l'ensemble de données sur lequel je travaille, il peut y avoir des cas où le délimiteur est constitué 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 mène au résultat final de [1,2,4,5,7,8,11 ,12].
Comment dois-je mettre à jour les scripts pour en tenir compte é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 partielles@jthi , @vince_faller , @txnelson . Merci! Ce sont d'excellentes solutions !
En fait, j'ai oublié d'inclure un scénario supplémentaire que je pourrais voir dans les données sur lesquelles je travaille. Le deuxième élément de la liste_clés est "aa bb", qui est composé de deux mots séparés par un délimiteur d'espace. Dans mon ensemble de données, il peut y avoir des cas où les mots sont séparés par d'autres caractères spéciaux, mais j'aimerais quand même les inclure. Par exemple, s'il y a une 12ème ligne avec une valeur de "aa-bb", j'aimerais qu'elle soit également appelée, donc le résultat final sera [1,2,4,5,7,8,11,12 ]
Comment procéderiez-vous pour mettre à jour les scripts pour tenir compte de cela ? Je suppose qu'il y a une étape où tous les délimiteurs de keys_list sont remplacés par un code spécial pour les caractères spéciaux qui peuvent être reconnus dans un modèle par regex ?
Merci pour l'aide!
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 regex J'aime si vous ne le savez pas très bien.
Aussi @jthi « ismissing() » n'avait-il pas l'habitude de travailler sur des chaînes ?Je me souviens que cela tuait toujours mes expressions rationnelles (d'où la raison pour laquelle j'ai utilisé `isstring()` ici).Bien que je l'ai essayé jusqu'à la version 14.3 et cela semble aller bien.
*Modifier* a créé le caractère générique.
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 partiellesJ'utiliserais très probablement une regex régulière ici avec quelque chose comme ça. Si ça devient trop lent, 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];