Fonction pour remplacer des caractères dans le texte d’une colonne

Accueil – Le CFO masqué Forums Power Query Fonction pour remplacer des caractères dans le texte d’une colonne

  • Ce sujet contient 14 réponses, 4 participants et a été mis à jour pour la dernière fois par Daniel, le il y a 1 année.
15 sujets de 1 à 15 (sur un total de 15)
  • Auteur
    Articles
  • #106050
    magali.careddu
    Participant

    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

    #106051
    Daniel
    Participant

    Bonjour 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
    Source

    Fin 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 mot

    Pas certain d’avoir été clair dans mes explications, mais cela fonctionne correctement pour moi.
    Cordialement
    Daniel

    Attachments:
    You must be logged in to view attached files.
    #106055
    Maurice Roy
    Participant

    Bonjour,

    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.
    #106058
    magali.careddu
    Participant

    Bonjour 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,
    Magali

    #106059
    magali.careddu
    Participant

    Merci 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,
    Magali

    #106108
    magali.careddu
    Participant

    Bonjour 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

    #106109
    Daniel
    Participant

    Bonjour 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
    Daniel

    #106110
    magali.careddu
    Participant

    Merci 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
    Source

    Est-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

    #106121
    Daniel
    Participant

    Bonjour 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ête

    En espérant avoir répondu correctement à ta demande
    Cordialement
    Daniel

    #106127
    magali.careddu
    Participant

    Bonjour 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.
    Magali

    #106198
    Daniel
    Participant

    Bonjour 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
    Daniel

    Attachments:
    You must be logged in to view attached files.
    #106200
    magali.careddu
    Participant

    Bonjour 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.
    Magali

    #106201
    magali.careddu
    Participant

    PS : 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 🙂

    #127379
    jerome.brun-picard
    Participant

    Bonjour.

    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 ” “.

    #127393
    Daniel
    Participant

    Bonjour 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 suit

    let
    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

15 sujets de 1 à 15 (sur un total de 15)
  • Vous devez être connecté pour répondre à ce sujet.