oguruma
XLDnaute Impliqué
Bonjour de retour après de longues semaines d'absence....
Ici je vous propose d'extraire des caractères d'une chaine selon un masque.
Masque :
La fonction PowerQuery
	
	
	
	
	
		
On peut aussi forcer la présence de caractères soit une liste définie par défaut dans le code soit en la précisant à l'appel de la fonction.
La liste par défaut :
{",", ".", ";", ":", "!", "§", "%", "£", "=", "+", "@", "_", "{", "}", "[", "]", "`", "&", "~", "°", "^", "*", "µ", "¤", "¨", "<", ">", "\", "/", "?", "ù", "#", " "}
Exemple d'appel :
Table.AddColumn(#"Changed Type", "ALL", each fnExtractCharacters([CHAINE], "X", false))
Table.AddColumn(#"Changed Type", "NUMBER", each fnExtractCharacters([CHAINE], "9",true)) --> on ajoute au masque la liste par défaut
Table.AddColumn(#"Changed Type", "TEXT", each fnExtractCharacters([CHAINE], "A"))
Table.AddColumn(#"Changed Type", "TEXT", each fnExtractCharacters([CHAINE], "U",true,":,9")) --> on ajoute au masque les caractères ":,9"
Le code complet de la fonction
	
	
	
	
	
		
Le code est assez ouvert et vous pouvez ajouter vos propres masques
	
		
			
		
		
	
				
			Ici je vous propose d'extraire des caractères d'une chaine selon un masque.
Masque :
- "X" : caractères ANSI de 0..127
- "A" : On ne retient que les lettres majuscules et minuscules
- "U" : On ne retient que les lettres majuscules
- "L" : On ne retient que les lettres minuscules
- "L9" : Caractères numériques et minuscules
- "U9" : Caractères numériques et majuscules
- "SU9" : Caractères numériques et majuscules et spéciaux
- "AU9" : Caractères numériques et majuscules et accentués
- "SL9" : Caractères numériques et minuscules et spéciaux
- "AL9" : Caractères numériques et minuscules et accentués
- "9A" : Caractères numériques et masjuscules
- "9X" : Caractères numériques et majuscules et minuscules
La fonction PowerQuery
		PowerQuery:
	
	
	fnExtractCharacters = (
    SourceField as text,                // Chaine de caractère initale à explourer
    StripMode as text,                  // Masque représentant les caractères à extraire de la chaine
    optional pAddChar as logical,       // Possibilité de retenir des caractères (AddChar) supplémentaires qui auraient été écartés par le masque
    optional pListChar as text) =>      // Possibilité de spécifier des caractères à retenir (liste restrcitive) qui auraient été écartés par le masqueOn peut aussi forcer la présence de caractères soit une liste définie par défaut dans le code soit en la précisant à l'appel de la fonction.
La liste par défaut :
{",", ".", ";", ":", "!", "§", "%", "£", "=", "+", "@", "_", "{", "}", "[", "]", "`", "&", "~", "°", "^", "*", "µ", "¤", "¨", "<", ">", "\", "/", "?", "ù", "#", " "}
Exemple d'appel :
Table.AddColumn(#"Changed Type", "ALL", each fnExtractCharacters([CHAINE], "X", false))
Table.AddColumn(#"Changed Type", "NUMBER", each fnExtractCharacters([CHAINE], "9",true)) --> on ajoute au masque la liste par défaut
Table.AddColumn(#"Changed Type", "TEXT", each fnExtractCharacters([CHAINE], "A"))
Table.AddColumn(#"Changed Type", "TEXT", each fnExtractCharacters([CHAINE], "U",true,":,9")) --> on ajoute au masque les caractères ":,9"
Le code complet de la fonction
		PowerQuery:
	
	
	let fnExtractCharacters = (
    SourceField as text,                // Chaine de caractère initale à explourer
    StripMode as text,                  // Masque représentant les caractères à extraire de la chaine
    optional pAddChar as logical,       // Possibilité de retenir des caractères (AddChar) supplémentaires qui auraient été écartés par le masque
    optional pListChar as text) =>      // Possibilité de spécifier des caractères à retenir (liste restrcitive) qui auraient été écartés par le masque
    let
        // Liste par défaut des caractères à ajouter
        //------------------------------------------
        AddChar = {",", ".", ";", ":", "!", "§", "%", "£", "=", "+", "@", "_", "{", "}", "[", "]", "`", "&", "~", "°", "^", "*", "µ", "¤", "¨", "<", ">", "\", "/", "?", "ù", "#", " "},
        // L'ajout de caractères est-il activié
        //-------------------------------------
        bAddChar = if pAddChar is null then false else pAddChar,
        // Des caractères spécifiques sont-ils précisés afin de ne pas prendre en considération la liste par défaut dans AddChar
        //----------------------------------------------------------------------------------------------------------------------
        sListChar = if pListChar is null then false else pListChar,
       
        // Prise en compte des caractères passé en paramètre afin de les retenir pour le résultat final
        //---------------------------------------------------------------------------------------------
        AddCharFinal =if sListChar <> false and bAddChar
                      then
                            let
                                s1=Text.ToList(pListChar)
                            in
                                s1
                      else
                            AddChar,
        // Construction du masque d'extraction des caractères
        //---------------------------------------------------
        Pattern =
            // Alphanumérique pour les caractères ANSI de 0..127
            if StripMode = "X"
            then List.Transform({0..127}, each Character.FromNumber(_))
            else
                // On ne retient que les chiffres de 0..9 ainsi que les signes -,+, le symbole monétaire et la décimale . ou ,
                if StripMode = "9"
                then {"0".."9", ".", ",", "-", "+", "€"}
                else
                // On ne retient que les lettres majuscules et minuscules
                if StripMode = "A"
                    then {"A".."Z","a".."z"}
                    else
                        // On ne retient que les majuscules
                        if StripMode = "U"
                        then {"A".."Z"}
                        else
                            // On ne retient que les minuscules
                            if StripMode = "L"
                            then {"a".."z"}
                            else
                                // Combinaison numérique et minuscules
                                if StripMode = "L9"
                                then {"0".."9", ".", ",", "-", "+", "€", "a".."z"}
                                else
                                    // Combinaison numérique et majuscules
                                    if StripMode = "U9"
                                    then {"0".."9", ".", ",", "-", "+", "€", "A".."Z"}
                                    else
                                        // Combinaison caractères spéciaux, numériques et majuscules
                                        if StripMode = "SU9"
                                        then
                                            let
                                                s1 = {"0".."9", ".", ",", "-", "+", "€", "A".."Z"},
                                                s2 = {123..190},
                                                s3 = List.Transform(s2, each Character.FromNumber(_)),
                                                s4 = List.Combine({s1,s3})
                                            in
                                                s4
                                        else
                                            // Combinaison caractères accentués, numériques et majuscules
                                            if StripMode = "AU9"
                                            then
                                                let
                                                   s1= {"0".."9", ".", ",", "-", "+", "€", "A".."Z"},
                                                   s2 = {191..255},
                                                   s3 = List.Transform(s2, each Character.FromNumber(_)),
                                                   s4 = List.Combine({s1,s3})
                                                in
                                                    s4
                                            else
                                                // Combinaison caractères spéciaux, numériques et minuscules
                                                if StripMode = "SL9"
                                                then
                                                    let
                                                        s1 = {"0".."9", ".", ",", "-", "+", "€", "a".."z"},
                                                        s2 = {123..190},
                                                        s3 = List.Transform(s2, each Character.FromNumber(_)),
                                                        s4 = List.Combine({s1,s3})
                                                    in
                                                        s4  
                                                else
                                                    // Combinaison caractères accentués, numériques et minuscules
                                                    if StripMode = "AL9"
                                                    then
                                                        let
                                                           s1= {"0".."9", ".", ",", "-", "+","a".."z"},
                                                           s2 = {191..255},
                                                           s3 = List.Transform(s2, each Character.FromNumber(_)),
                                                           s4 = List.Combine({s1,s3})
                                                        in
                                                            s4
                                                    else
                                                        // Combinaison numérique et majuscules
                                                        if StripMode = "9A"
                                                        then {"0".."9", "A".."Z", "-", "+", ".", ","}
                                                        else
                                                            // Combinaison numérique et minuscules+majuscules
                                                            if StripMode = "9X"
                                                            then {"0".."9", "A".."Z", "a".."z", "-", ".", "+", ","}
                                                            else
                                                                null,  
        // Construction du masque final
        //-----------------------------
        PatternFinal = if bAddChar
                       then
                            let
                                s = List.Combine({Pattern,AddCharFinal})
                            in
                                s
                        else
                            Pattern,
        // Extraction des caractères selon le masque
        //------------------------------------------
        FinalString = Text.Select(SourceField, PatternFinal)
    in
        FinalString
in
    fnExtractCharactersLe code est assez ouvert et vous pouvez ajouter vos propres masques
 
	 
 
		