Récemment, une apprenante m’a soumis une problématique à résoudre dans Power Query qui m’apparaissait très simple au départ et qui s’est finalement avérée un peu plus complexe que prévu. L’apprenante souhaitait vérifier si les expressions contenues une colonne de sa table, comprenaient un ou l’autre des mots faisant partie d’une liste. S’il est simple de vérifier les équivalences “exactes”, il est plus ardu de vérifier si les expressions contiennent un mot sans pour autant être une expression équivalente. Cet article vise à démontrer une démarche possible pour rechercher des mots d’une liste dans Power Query.
Données de départ
Pour illustrer le cas, nous avons utilisé les données ci-dessous. La problématique consiste à déterminer si les mots de la colonne MOT comprennent un des mots de la liste à droite. La colonne STATUT indique le résultat recherché.
Solution pour trouver les mots d’une liste dans Power Query
Nous avons d’abord défini un paramètre “SearchInParameter”, que nous avons d’abord établi comme étant “Chien-loup”.
Dans notre liste, nous avons ajouté une colonne, qui insère tout simplement la valeur du paramètre. Comme notre paramètre initial est “Chien-loup”, nous voyons donc apparaître cette valeur dans la nouvelle colonne “SearchIn”.
Dans la même requête, nous avons ajouté une autre colonne qui, à l’aide de la fonction Text.Contains, vérifie si le mot de la colonne “Liste” est présent dans l’expression de la colonne “SearchIn”. La fonction retourne donc un TRUE (VRAI) pour le mot “Chien” dans la liste.
L’idée est donc de procéder à l’envers. Nous allons vérifier si chacun des mots de notre liste est contenu ou non dans chacune des expressions de notre colonne MOT de nos données originales.
À cette étape-ci, nous avons donc filtré sur les TRUE (VRAI).
Nous avons ensuite compté le nombre de lignes qui retournent un TRUE (VRAI).
Dans ce cas-ci, nous obtenons une ligne, donc 1.
IMPORTANT: À ce stade-ci, nous avons converti cette requête en fonction, que nous avons nommée fnContains. Cette fonction a un paramètre, soit l’expression dans laquelle on recherche les différents mots de la liste.
Vous devez analyser de grandes quantités de données et les présenter dans des rapports et tableaux de bord, avec des indicateurs de performance pertinents ? Développez vos compétences avec nos formations en Power BI en français ou en anglais. |
---|
Nous sommes ensuite allée dans notre requête avec la table des mots d’origine et nous avons ajouté une colonne pour appeler notre fonction personnalisée.
Ce faisant, la fonction vérifie si les mots de la liste sont compris ou non dans chacun des mots de la colonne MOT et retourne “null” quand il n’y a pas de TRUE (VRAI) donc quand il n’y a pas de correspondance et retourne un chiffre lorsqu’il y a au moins une correspondance. Nous avons ensuite ajouté une colonne pour retourner un FALSE quand la colonne “Nombre” = null et TRUE dans les autres cas.
Au final, nous obtenons bien les résultats recherchés au départ.
Pour plus de performance, il peut s’avérer utile d’imbriquer notre liste dans une fonction Table.Buffer (pour éviter qu’elle se réactualise à chaque évaluation de la fonction).
Voyez le tout en action dans ce tutoriel
🎞️ Abonnez-vous à notre chaîne YouTube
Bon visionnement !
Fichier d’accompagnement VIP à télécharger
Pour télécharger le fichier utilisé dans ce tutoriel, devenez membre VIP du CFO masqué.
Formation complémentaire
Afin d’approfondir vos connaissances avec Power BI et plus particulièrement vos compétences avec l’éditeur de requête Power Query, nous vous recommandons notre formation Recettes magiques pour transformer vos données.
Voici quelques commentaires d’apprenants ayant suivi la formation en ligne Recettes magiques pour transformer vos données :
Bonjour
Pour répondre avec une formule Excel à cette question je propose =ESTNUM(EQUIV(1;EQUIV(“*”&Tableau2[Liste]&”*”;[@Mot];0);0)) en matricielle
Je rencontre un problème similaire auquel j’ai répondu avec une méthode un peu différente sur laquelle je coince avec PowerQuery :
– comment traduire une recherche avec les caractères joker : * et ? (Ch*t pour Chiot et Chat) ;
– comment gérer la casse (si on cherche “Chauve-souris” et non “Chauve-Souris” PowerQuery répondra FAUX)
EQUIV gère les caractères joker (on peut même chercher les “vrais” caractères * et ? en mettant un ~ devant) et ne tient pas compte de la casse
Je vais donc mettre un fichier exemple de mon problème sur le blog
Stéphane
Bonjour,
Merci pour l’info. Mais comment faire si je souhaite utiliser cette fonction au niveau de mon visuel afin de modifier la recherche côté interface utilisateur. Exemple, lors de la création de votre exemple on recherche le mot chien. Ok. Mais si l’utilisateur final souhaite chercher un autre mot comment faut t’il procéder au niveau visuel. Merci
Bonjour,
Pour utiliser un paramètre spécifié par l’usager, il faudrait le faire avec Power Query dans Excel (l’usager entrerait alors la valeur dans une cellule Excel qui serait reprise dans le code M) ou si on veut demeurer dans Power BI, il faudrait utiliser Microsoft Flow pour automatiser le processus.
Au plaisir,
Sophie
Bonsoir
Ma petite question :
Si dans la colonne mot c’est une phrase et non juste un mot.
Comment puis à partir de la liste des mots me dirent si plusieurs d’eux existent dans une phrase et si il y a une présence dire quel sont les mots dans une colonne distinct.
Bonjour,
Je vous suggère de poser votre question sur notre forum en appuyant votre question avec un fichier d’exemple de vos données et le résultat souhaité.
Un membre de la communauté pourra certainement vous aider.
https://www.lecfomasque.com/forums/
Au plaisir,
Kim