POWERQUERY :: Supprimer les lignes et colonnes vides

oguruma

XLDnaute Occasionnel
Bonjour,
on suppose que l'on reçoive un fichier pas très bien finalisé comme par exemple
DOMAINE;APPLI;LIB_APP;CERTIF_1;CERTIF_2;CERTIF_3;OK;KO;TOTAL;COMMENT
Domaine_1;Appli_1_1;;16;21;25;57;;;
Domaine_1;Appli_1_2;;20;29;21;56;;;
Domaine_1;Appli_1_3;;16;20;20;49;;;
Domaine_1;Appli_1_4;;21;30;16;54;;;

Domaine_1;Appli_1_5;;22;17;15;45;;;
Domaine_1;Appli_1_6;;16;17;29;56;;;
Domaine_1;Appli_1_7;;29;18;17;59;;;
Domaine_1;Appli_1_8;;27;20;18;57;;;
Domaine_1;Appli_1_9;;22;29;27;64;;;
Domaine_1;Appli_1_10;;19;25;24;57;;;

Domaine_2;Appli_2_1;;17;21;29;66;;;
Domaine_2;Appli_2_2;;15;26;15;48;;;
Domaine_2;Appli_2_3;;25;23;17;51;;;

Celui comporte des lignes et colonnes vides
1722434473882.png


Le but étant d'obtenir
1722434565752.png


Pour cela 3 fonctions :
- une pour supprimer les lignes vides
- une pour supprimer les colonnes vides
- une pour supprimer les lignes et colonnes vides

PowerQuery:
let fnDeleteEmptyRows = (pSource as any) =>
    let
        Source=if pSource is table
                then pSource
                else Excel.CurrentWorkbook(){[Name=pSource]}[Content],
                
        LST_NULL={"", null},
        LST_NULL_EMPTY={""},
        
        //********************************************************************************************************
        // On va sélectionner les enregistrements non vides
        //********************************************************************************************************
        TBL_DELETE_EMPTY_ROWS = Table.SelectRows(Source,
                // On prépara la sélection
                (pElemX) => not List.IsEmpty(
                                // On supprimera ceux qui ne correspondent pas à la transformation soit ceux qui sont vides
                                List.RemoveMatchingItems(
                                    List.Transform(
                                        // On réitère l'opération par un second nettoyage des vides
                                        List.RemoveMatchingItems(Record.FieldValues(pElemX),LST_NULL),
                                        (pElemY) => try Text.Clean(Text.Trim(pElemY)) otherwise pElemY),
                                        LST_NULL_EMPTY)
                            )
                        )
    in
        TBL_DELETE_EMPTY_ROWS
in 
    fnDeleteEmptyRows

PowerQuery:
let fnDeleteEmptyColumns = (pSource as any)=>
    let
        Source=if pSource is table
                then pSource
                else Excel.CurrentWorkbook(){[Name=pSource]}[Content],
                
        STR_EMPTY="",
        LST_Columns=Table.ColumnNames(Source),
        
        //********************************************************************************************************
        // On va sélectionner les colonnes non vides
        //********************************************************************************************************
        TBL_DELETE_EMPTY_COLUMNS = Table.SelectColumns(Source ,
                                    // Pour les colonnes on procède via des listes - La suppression est verticale
                                    // Ici les sélection se font en mode liste et non row comme pour les lignes
                                    List.Select(
                                            LST_Columns,
                                                // On ne retient que les colonnes non Null
                                                (ElemX) => List.NonNullCount(List.Transform(Table.Column(Source, ElemX),
                                                    (ElemY) => try if Text.Clean(Text.Trim(ElemY)) = STR_EMPTY then null else ElemY otherwise ElemY )) > 0 ))
    in
        TBL_DELETE_EMPTY_COLUMNS
in 
    fnDeleteEmptyColumns

PowerQuery:
let fnDeleteEmptyRowsColumns = (pSource as any) =>
    let
        Source=if pSource is table
                then pSource
                else Excel.CurrentWorkbook(){[Name=pSource]}[Content],
                
        TBL_Source_1=fnDeleteEmptyRows(Source),
        TBL_Source_2=fnDeleteEmptyColumns(TBL_Source_1)
    in
        TBL_Source_2
in 
    fnDeleteEmptyRowsColumns

Exemple d'utilisation
PowerQuery:
let
    
    TBL_DELETE_EMPTY_ROWS = fnDeleteEmptyRows(TBL_SRC_Traitements)
in
    TBL_DELETE_EMPTY_ROWS
    

let
    
    TBL_DELETE_EMPTY_ROWS = fnDeleteEmptyColumns(TBL_SRC_Traitements)
in
    TBL_DELETE_EMPTY_ROWS
    

let
    
    TBL_DELETE_EMPTY_ROWS = fnDeleteEmptyRowsColumns(TBL_SRC_Traitements)
in
    TBL_DELETE_EMPTY_ROWS
 

Pièces jointes

  • Traitements_Brut.txt
    1.5 KB · Affichages: 2
  • DeleteEmptyRowsAndEmpyColumnsBlank_V0.010.xlsx
    31.6 KB · Affichages: 2

Discussions similaires

Statistiques des forums

Discussions
313 865
Messages
2 103 078
Membres
108 521
dernier inscrit
manouba