Accueil – Le CFO masqué › Forums › Power Query › Fonction pour remplacer des caractères dans le texte d’une colonne
- This topic has 14 réponses, 4 participants, and was last updated il y a 1 years et 7 months by Daniel.
-
AuteurArticles
-
28 juillet 2022 à 11 h 24 min #106050magali.caredduParticipant
Bonjour,
Je début dans l’utilisation des fonctions sous Power Query et je rencontre actuellement le problème suivant :
Je souhaite remplacer tous les accents des voyelles d’une colonne (Ville Origine) par des voyelles sans accent. Pour cela, j’ai écrit dans une requête vide le code M :
let
Source = transfotexte,
Accents = {“é”, “è”, “ê”, “à”, “ù”, “û”, “ô”, “î”},
SansAccent = {“e”, “e”, “e”, “a”, “u”,”u”, “o”, “i”},
resultat = Replacer.ReplaceText(Source,Accents,SansAccent)
in
resultat
Malheureusement lorsque j’appelle cette fonction en cliquant sur l’onglet Ajouter une colonne puis en cliquant sur Appeler une fonction personnalisée, celle-ci me renvoit error sur chacune des ligne de la colonne Ville Origine.Pouvez-vous me dire où est le problème et si vous avez une autre proposition à me faire ?
Dans l’attende de votre réponse, je vous remercie d’avance pour l’aide apportée.Cordialement,
Magali
28 juillet 2022 à 12 h 56 min #106051DanielParticipantBonjour Magali,
Ayant déjà été confronté à ce problème, je l’ai résolu par une fonction qui peut me servir pour d’autres tâches de ce type, cela fonctionne mais il y a certainement d’autres manières de faire.
En pièce jointe, l’exemple et bien sur la fonction utilisée.Début Fonction
let
Source = (MonTexte as text) =>
let
ListeAccents =
{
{“à”,”a”},
{“á”,”a”},
{“â”,”a”},
{“ã”,”a”},
{“ä”,”a”},
{“å”,”a”},
{“è”,”e”},
{“é”,”e”},
{“ê”,”e”},
{“ë”,”e”},
{“ì”,”i”},
{“í”,”i”},
{“î”,”i”},
{“ï”,”i”},
{“ò”,”o”},
{“ó”,”o”},
{“ô”,”o”},
{“õ”,”o”},
{“ö”,”o”},
{“ø”,”o”},
{“ù”,”u”},
{“ú”,”u”},
{“û”,”u”},
{“ü”,”u”},
{“ů”,”u”},
{“È”,”E”},
{“É”,”E”},
{“Ê”,”E”},
{“Ë”,”E”}
}
in
Text.Combine(List.ReplaceMatchingItems(Text.ToList(MonTexte), ListeAccents))
in
SourceFin Fonction
Ensuite créer une colonne personnalisée et écrire fnEnleverAccents([Ville Origine]) ou fnEnleverAccents est le nom de la fonction et [Ville Origine] est le nom de la colonne qui contient les caractères accentués.
Text.ToList(MonTexte) : crée une liste contenant chaque caractères de la ville
List.ReplaceMatchingItems(Text.ToList(MonTexte), ListeAccents) : remplace les différents caractères de Text.ToList(MonTexte] par les items de ListeAccents
et Text.Combine : remet les différentes parties du teste en un seul motPas certain d’avoir été clair dans mes explications, mais cela fonctionne correctement pour moi.
Cordialement
DanielAttachments:
You must be logged in to view attached files.28 juillet 2022 à 16 h 20 min #106055Maurice RoyParticipantBonjour,
Dans Power Query certaine fonction sont déjà écrite pour vous.
Celle que vous chercher est Barre de menue\Transformer\Remplacer les valeurs\ ensuite compléter les champs.Maurice
Attachments:
You must be logged in to view attached files.29 juillet 2022 à 2 h 00 min #106058magali.caredduParticipantBonjour Daniel,
Merci beaucoup pour l’envoi du code ! C’est sûr je n’aurai pas pu le trouver toute seule celui-là 😉 et en plus comme tu l’as dit il peut être utilisé pour d’autres usages. C’es le top !
Je viens de le tester et après quelques réglages tout est ok dans mon fichier.
Encore un grand merci pour ton retour rapide et ton expertise sur ce sujet.
Bien cordialement,
Magali29 juillet 2022 à 2 h 03 min #106059magali.caredduParticipantMerci Maurice pour ta réponse.
J’avais aussi testé cette solution en premier mais je n’étais pas satisfaite au vu du nombre d’étapes à créer, d’où l’idée d’une fonction. D’ailleurs, tu peux voir le code M envoyé par Daniel qui est la solution que je recherchais dans mon cas précis.
En tous les cas je te remercie d’avoir pris le temps de me répondre.
Bien cordialement,
Magali30 juillet 2022 à 7 h 42 min #106108magali.caredduParticipantBonjour Daniel,
Je me permets de revenir vers toi car j’ai avancé dans mon projet en rajoutant d’autres caractères dans la fonction que tu m’as proposée et qui marche très bien !!!
J’ai juste un dernier problème et peut-être que tu pourras m’aider à le résoudre.
Power Query étant sensible à la casse, j’ai besoin de remplacer toute les majuscules de ma colonne Ville Origine en minuscules sauf la première lettre. Mais cela me semble un peu complexe à écrire en langage M.
As-tu déjà été confronté à ce problème ?
Sinon ce n’est pas grave, je vais essayer de contourner mon problème autrement…Je te souhaite un Bon week-end 😉
Magali
30 juillet 2022 à 11 h 49 min #106109DanielParticipantBonjour Magali, Le Forum,
Et en utilisant la fonction Text.Proper sur la colonne Villes, est-ce que ton problème est résolu ?
Pour bien comprendre comment souhaiterais-tu que soit écrit “La Seyne-sur-Mer”, est-ce que c’est comme cela que tu le souhaites “La seyne-sur-mer”. Aurais-tu des exemples ?
Cordialement
Bon Week-end à tous
Daniel30 juillet 2022 à 17 h 36 min #106110magali.caredduParticipantMerci pour ton retour Daniel : effectivement cela marche !
Par contre, je voudrai revenir sur le code initial que tu m’as transmis.
En l’appliquant sur le remplacement de tiret (“-” ou “_”) par un espace (” “) ça fonctionne bien. Mais j’ai un autre cas que je dois aussi traiter où cela ne fonctionne pas :
Je voudrai remplacer les villes qui contiennent “St” par “Saint” (exemple St-Pierre devient Saint-Pierre) avec toutes les possibilités d’écriture mais cette fois la fonction n’effectue pas le remplacement. Voici le code en question :let
Source = (MonTexte as text) =>
let
ListeAccents =
{
{“à”,”a”},
{“á”,”a”},
{“â”,”a”},
{“ã”,”a”},
{“ä”,”a”},
{“å”,”a”},
{“è”,”e”},
{“é”,”e”},
{“ê”,”e”},
{“ë”,”e”},
{“ì”,”i”},
{“í”,”i”},
{“î”,”i”},
{“ï”,”i”},
{“ò”,”o”},
{“ó”,”o”},
{“ô”,”o”},
{“õ”,”o”},
{“ö”,”o”},
{“ø”,”o”},
{“ù”,”u”},
{“ú”,”u”},
{“û”,”u”},
{“ü”,”u”},
{“ů”,”u”},
{“È”,”E”},
{“É”,”E”},
{“Ê”,”E”},
{“Ë”,”E”},
{“-“,” “},
{“_”,” “},
{“ST-“,”SAINT “},
{“ST “,”SAINT “},
{” ST “,” SAINT “},
{“St-“,”Saint “},
{“St “,”Saint “},
{” St “,” Saint “}
}
in
Text.Combine(List.ReplaceMatchingItems(Text.ToList(MonTexte), ListeAccents))
in
SourceEst-ce que cette fonction ne s’applique que pour des caractères uniques ? ce qui expliquerait que je n’obtienne pas le résultat voulu…
Encore merci pour ton aide… une ultime fois j’espère 😉
Bien cordialement.
Magali
31 juillet 2022 à 15 h 12 min #106121DanielParticipantBonjour Magali, Le Forum,
Je reviens sur la requête envoyée dans mon premier post, je l’ai modifié afin de répondre à ta dernière question (par contre ne connaissant pas les modifications que tu as pu apporter entre-temps, tu seras obligée de les refaire).
J’ai gardé la fonction fnEnleverAccents et j’ai ajouté des étapes pour remplacer les “Ste” en “Sainte” et “St” en “Saint” (tu les trouveras dans l’étape nommée “ListeDeListes”, et tu pourras en ajouter d’autres si besoin). J’ai aussi utilisé la fonction Power Query “Text.Trim” qui supprime les espaces devant et derrière une chaîne de caractères (voir étape “MettreVillesEnListe”) en complément de la fonction Text.Split qui découpe la chaîne de caractères en fonction d’un séparateur (en l’occurrence l’espace).
Dans l’étape “RemplacementsAFaire”, j’ai remis le tiret comme séparateur mais si tu le souhaites tu peux le remplacer par un espace.Code de la requête
let
Source = Excel.CurrentWorkbook(){[Name=”Tableau1″]}[Content],
RenommerColonneVilles = Table.RenameColumns(Source,{{“Villes”, “Villes Origine”}}),
AjoutColonneVillesTmp = Table.AddColumn(RenommerColonneVilles, “Villes_tmp”, each fnEnleverAccents([Villes Origine])),
ListeDeListes = {
{“Ste”,”Sainte”},
{“St”,”Saint”}
},
MesVilles = AjoutColonneVillesTmp,
MettreVillesEnListe = Table.AddColumn(MesVilles, “Custom”, each Text.Split(Text.Trim([Villes_tmp]), “-“)),
RemplacementsAFaire = Table.AddColumn(MettreVillesEnListe, “Villes”, each Text.Combine(List.ReplaceMatchingItems([Custom],ListeDeListes),”-“)),
SuppressionAutresColonnes = Table.SelectColumns(RemplacementsAFaire,{“Villes”})
in
SuppressionAutresColonnes
Fin du code de la requêteEn espérant avoir répondu correctement à ta demande
Cordialement
Daniel1 août 2022 à 8 h 13 min #106127magali.caredduParticipantBonjour Daniel,
Un grand merci d’avoir pris le temps de résoudre ma problématique !
Cette semaine je n’aurai malheureusement pas le temps d’étudier en détail le contenu du code que tu as écrit (étant en déplacement) mais dès que je peux j’essaierai de te tenir au courant…
Pour rappel je débute dans les fonctions et je suis impressionnée par le niveau que tu as 😉
Encore merci et bonne semaine.
Magali5 août 2022 à 12 h 35 min #106198DanielParticipantBonjour Magali, Le Forum,
Je reviens sur ma dernière proposition qui fonctionne correctement, j’ai cherché d’autres solutions que je te propose dans le fichier joint.
J’ai essayé de mettre quelques explications en espérant que cela t’aidera.
Cordialement
DanielAttachments:
You must be logged in to view attached files.5 août 2022 à 16 h 59 min #106200magali.caredduParticipantBonjour Daniel,
Encore merci pour ce nouveau fichier joint très pédagogique !
Il va me permettre de mieux comprendre le code grâce aux commentaires que tu as rajoutés.
Je vais donc fortement m’en inspirer 😀
Ton aide m’a été d’un grand secours et je t’en remercie.
Bien cordialement.
Magali5 août 2022 à 17 h 31 min #106201magali.caredduParticipantPS : après avoir adapté ton code sur ma requête, je te confirme ça marche !
J’avais juste un problème de casse car certaines de mes villes étaient en majuscule (ouf).
Un grand merci Daniel 🙂13 avril 2023 à 16 h 31 min #127379jerome.brun-picardParticipantBonjour.
Tout d’abord merci d’avoir partagé cette solution. Elle m’est très utile.
J’aimerais partager un problème que j’ai rencontré lors de l’utilisation de cette fonction. Il arrive que dans le jeu de données, certains enregistrements contiennent la valeur null plutôt que du texte. Cela causait donc une erreur puisque PowerQuery ne peut convertir null au type Texte.
Pour contourner le problème, j’ai inséré une étape au préalable pour remplacer les valeurs “null” par ” “.
14 avril 2023 à 11 h 31 min #127393DanielParticipantBonjour Jérôme, le Forum,
Merci pour ton retour.
On peut aussi utiliser Try …. otherwise pour régler le problème des lignes nulles comme suitlet
Source = Excel.CurrentWorkbook(){[Name=”Tableau1″]}[Content],// Utilisation de la fonction Power Query TransformColumns qui permet d’exécuter une ou plusieurs fonctions sur cette colonne sans passer par la création de colonnes temporaires
// le tiret que tu peux voir correspond à l’item de la table en cours (en l’occurence Source est la table et Ville est la colonne de la table)
AjoutColonneVillesTmp = Table.TransformColumns(Source,
{
{“Villes”,each try fnEnleverAbreviations(fnEnleverAccents(_)) otherwise _}
}
),
#”Type modifié” = Table.TransformColumnTypes(AjoutColonneVillesTmp,{{“Villes”, type text}})
in
#”Type modifié”
Cordialement
Daniel -
AuteurArticles
- Vous devez être connecté pour répondre à ce sujet.