Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

POWERQUERY :: Splitter des colonnes - Plusieurs méthodes selon la nature des colonnes

oguruma

XLDnaute Occasionnel
Bonjour, voici 3 méthodes pour splitter des colonnes

Méthode 1


Résultat


PowerQuery:
let

    Tbl=fnGetParameter("TB_PARAMS_1","TBL","PARAM", "VALEUR"),
    Cols=fnGetParameter("TB_PARAMS_1","COLONNE_SPLIT","PARAM", "VALEUR"),
    Sep=fnGetParameter("TB_PARAMS_1","SEPARATEUR_SPLIT_1","PARAM", "VALEUR"),


    Source = fnSplitMagicColumnsV1(Tbl, Cols, Sep, true)
in
    Source

PowerQuery:
let fnSplitMagicColumnsV1 = (
         pTableData as any,
         pColumnToSplit as text,        
         optional pSeparator as text,
         optional pChangeTypeColumns as logical
   ) as table =>

      let

         //=======================================================================================================
         // Gestion des paramètres
         //=======================================================================================================
         TableData=if pTableData is null then false else pTableData,
         ColumnToSplit=if pColumnToSplit is null then false else pColumnToSplit,
         ChangeTypeColumns=if pChangeTypeColumns is null then false else pChangeTypeColumns,
         Separator=if pSeparator is null then ";" else pSeparator,

         //=======================================================================================================
         // On accède à la table à traiter
         //=======================================================================================================
         Source = try
                     if TableData is text
                     then Excel.CurrentWorkbook(){[Name=TableData]}[Content]
                     else  TableData
                  otherwise false,
         //=======================================================================================================
         // Traitement de la table à condition qu'elle existe
         //=======================================================================================================
         ToTableSplit= if Source is table then
                        let
                           SplitColumnsTitle=Text.Split(pColumnToSplit,Separator),
                           ChangeType = Table.TransformColumnTypes(Source,{{pColumnToSplit, type text}}),
                           SplitMagic = Table.SplitColumn(ChangeType, pColumnToSplit, Splitter.SplitTextByDelimiter(Separator, QuoteStyle.Csv), SplitColumnsTitle)
                        in
                           SplitMagic
                        else
                           "#Table " & pTableData & " inconnue"  
      in
         ToTableSplit
in
   fnSplitMagicColumnsV1





PowerQuery:
let

    Tbl=fnGetParameter("TB_PARAMS_2","TBL","PARAM", "VALEUR"),
    Cols=fnGetParameter("TB_PARAMS_2","COLONNE_SPLIT","PARAM", "VALEUR"),
    Sep1=fnGetParameter("TB_PARAMS_2","SEPARATEUR_SPLIT_1","PARAM", "VALEUR"),  
    ListSep=fnGetParameter("TB_PARAMS_2","SEPARATEUR_VALEUR","PARAM", "VALEUR"),

    Source = fnSplitMagicColumnsV2(Tbl, Cols, "-,/", Sep1, true)
in
    Source

PowerQuery:
let fnSplitMagicColumnsV2 = (
    pTableData as any,
    pColumnsToSplit as text,
    pListSep as text,
    optional pSeparator_1 as text,
    optional pChangeTypeColumns as logical
   
   
      ) =>

      let

      //=======================================================================================================
      // Gestion des paramètres
      //=======================================================================================================
      TableData=if pTableData is null then false else pTableData,
      ColumnsToSplit=if pColumnsToSplit is null then false else pColumnsToSplit,
      Separator_1=if pSeparator_1 is null then "§" else pSeparator_1,
      ChangeTypeColumns=if pChangeTypeColumns is null then false else pChangeTypeColumns,

      // Les colonnes à traiter sont transformées en liste
      ListColumnsToSplit=Text.Split(ColumnsToSplit,Separator_1),

      // Nombre de colonnes à traiter
      NbColumnsToSplit=List.Count(ListColumnsToSplit),

      // Liste des séparateurs pour chaque colonne
      //ListSep=Text.Split(pListSep,pSeparator_2),
      ListSep=Text.ToList(pListSep),  

      //=======================================================================================================
      // On accède à la table à traiter
      //=======================================================================================================
      Source = try
                  if TableData is text
                  then Excel.CurrentWorkbook(){[Name=TableData]}[Content]
                  else  TableData
                  otherwise false,

      //=======================================================================================================
      // Traitement de la table à condition qu'elle existe
      // On va boucler sur la liste des colonnes à splitter
      //=======================================================================================================
      ToTableSplit=
            if Source is table then        
            let
                  // On va construire la table finale de manière itérative
                  GenerateSplit=List.Accumulate(
                        ListColumnsToSplit,  // Liste des colonnes à traiter
                        Source,              // On initialise l'accumulateur sur la source initiale
                        (state, current) =>
                              let
                                    P=List.PositionOf(ListColumnsToSplit,current),  // On recherche le séparateur de la colonne en cours de traitement          
                                    SplitColumnsTitle=Text.Split(current,ListSep{P}),   // Le nom de la colonne transformé en liste
                                    // Le traitement initial a lieu sur l'accumulateur pour la modification du type
                                    ChangeType = if ChangeTypeColumns then Table.TransformColumnTypes(state,{{current, type text}}) else state,  // On force le type texte
                                    // Eclatement de la colonne en cours dans la variable current  - l'accumulateur est automatiquement mise à jour
                                    SplitMagic = Table.SplitColumn(ChangeType, current, Splitter.SplitTextByDelimiter(ListSep{P}, QuoteStyle.Csv), SplitColumnsTitle)
                              in
                                    SplitMagic
                  )
            in
                  GenerateSplit
            else
                  "#Table " & pTableData & " inconnue"
      in
      ToTableSplit
in
      fnSplitMagicColumnsV2





PowerQuery:
let

    Tbl=fnGetParameter("TB_PARAMS_3","TBL","PARAM", "VALEUR"),
    Cols=fnGetParameter("TB_PARAMS_3","COLONNE_SPLIT","PARAM", "VALEUR"),
    ColsTitle=fnGetParameter("TB_PARAMS_3","COLONNE_TITRE","PARAM", "VALEUR"),
    Sep1=fnGetParameter("TB_PARAMS_3","SEPARATEUR_SPLIT_1","PARAM", "VALEUR"),  
    Sep2=fnGetParameter("TB_PARAMS_3","SEPARATEUR_SPLIT_2","PARAM", "VALEUR"),  
    ListSep=fnGetParameter("TB_PARAMS_3","SEPARATEUR_VALEUR","PARAM", "VALEUR"),

    Source = fnSplitMagicColumnsV3(Tbl, Cols, ColsTitle, "-,/", Sep1, Sep2, true)
in
    Source

PowerQuery:
let fnSplitMagicColumnsV3 = (
            pTableData as any,
            pColumnsToSplit as text,
            pColumnsTitles as text,
            pListSep as text,          
            optional pSeparator_1 as text,
            optional pSeparator_2 as text,
            optional pChangeTypeColumns as logical
) =>
            let

            //=======================================================================================================
            // Gestion des paramètres
            //=======================================================================================================
            TableData=if pTableData is null then false else pTableData,
            ColumnsToSplit=if pColumnsToSplit is null then false else pColumnsToSplit,
            ChangeTypeColumns=if pChangeTypeColumns is null then false else pChangeTypeColumns,
            Separator_1=if pSeparator_1 is null then "§" else pSeparator_1,
            Separator_2=if pSeparator_1 is null then "-" else pSeparator_2,
            ColumnsTitles=pColumnsTitles,

            // Les colonnes à traiter sont transformées en liste
            ListColumnsToSplit=Text.Split(ColumnsToSplit,Separator_1),
            ListColumnsTitles=Text.Split(ColumnsTitles,Separator_1),
            ListSep=Text.ToList(pListSep),  

            // Nombre de colonnes à traiter
            NbColumnsToSplit=List.Count(ListColumnsToSplit),
            NbColumnsTitles=List.Count(ListColumnsTitles),

            //=======================================================================================================
            // On accède à la table à traiter
            //=======================================================================================================
            Source = try
                        if TableData is text
                        then Excel.CurrentWorkbook(){[Name=TableData]}[Content]
                        else  TableData
                        otherwise false,

            //=======================================================================================================
            // Traitement de la table à condition qu'elle existe
            // On va boucler sur la liste des colonnes à splitter
            //=======================================================================================================
            ToTableSplit=
                  if Source is table then        
                  let
                        // On va construire la table finale de manière itérative
                        GenerateSplit=List.Accumulate(
                              ListColumnsToSplit,  // Liste des colonnes à traiter
                              Source,              // On initialise l'accumulateur sur la source initiale
                              (state, current) =>
                                    let
                                          P=List.PositionOf(ListColumnsToSplit,current),  // On recherche le séparateur de la colonne en cours de traitement        
                                          SplitColumnsTitle=Text.Split(ListColumnsTitles{P},Separator_2),   // Le nom de la colonne transformé en liste
                                          // Le traitement initial a lieu sur l'accumulateur pour la modification du type
                                          ChangeType = if ChangeTypeColumns then Table.TransformColumnTypes(state,{{current, type text}}) else state,  // On force le type texte
                                          // Eclatement de la colonne en cours dans la variable current  - l'accumulateur est automatiquement mise à jour
                                          SplitMagic = Table.SplitColumn(ChangeType, current, Splitter.SplitTextByDelimiter(ListSep{P}, QuoteStyle.Csv), SplitColumnsTitle)
                                    in
                                    SplitMagic
                        )
                  in
                        GenerateSplit
                  else
                        "#Table " & pTableData & " inconnue"
            in
            ToTableSplit
in
      fnSplitMagicColumnsV3

PowerQuery:
let fnGetParameter =
    (
        pTable          as any,
        pName           as text,
        optional pParam as text,
        optional pVal   as text
    ) =>

    let
        ParamSource = if pTable is text then
                         Excel.CurrentWorkbook(){[Name=pTable]}[Content]
                         else pTable,

        Parametre   = if pParam <> null then
                         pParam
                         else "PARAMETRE",

        Valeur      = if pVal <> null then
                         pVal
                         else "VALEUR",

        StrParam="each ([" & Parametre & "]) = " & """" & pName & """",
        EvalParam=Expression.Evaluate(StrParam,[ParamSource=ParamSource]),       
        
        ParamRow = Table.SelectRows(ParamSource, EvalParam),
        
        Value= if Table.IsEmpty(ParamRow)=true
                  then null
                  else Record.Field(ParamRow{0},Valeur)
    in
        Value
in
    fnGetParameter
 

Pièces jointes

  • SPLIT_MAGIC_COLONNES_V0.032.xlsx
    41.4 KB · Affichages: 3

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…