IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

POWER Discussion :

[Power Query] Lister les dossiers / sous-dossiers Même vides


Sujet :

POWER

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2015
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2015
    Messages : 57
    Points : 34
    Points
    34
    Par défaut [Power Query] Lister les dossiers / sous-dossiers Même vides
    Bonjour,

    Power Query permet de lister les fichiers à partir d'un dossier et de ses sous-dossiers, néanmoins si un répertoire est vide celui-ci n'est pas listé.
    Y'a t'il possibilité d'inclure ces dossiers / sous dossiers s'ils sont vides ?
    Plus globalement j'aimerais connaître le nombre de fichiers dans chaque dossier / sous dossier y compris si les répertoires sont vides.

    Merci et Bon WE !!

  2. #2
    Membre émérite
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 055
    Points : 2 518
    Points
    2 518
    Par défaut
    Bonjour

    Il faut utiliser la fonction Folder.Contents et non Folder.Files (par défaut)


    A la différence de Folder.Files qui liste les fichiers contenus dans le dossier et les sous-dossiers, Folder.Contents va lister les fichiers du dossier uniquement (champ [Content] de type Binary) + les sous-dossiers (champ [Content] de type Table).


    Stéphane

  3. #3
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Salut.

    Le problème de Folder.Contents, c'est qu'il n'est pas récursif. Il faut filtrer sur la propriété "Folder" pour avoir la colonne Folder qui ne contient que des tables, et refaire cela pour chaque niveau. Ca ne remplace donc pas un DIR récursif. Peut-être est-il possible d'écrire une récursive pour exploiter les différents niveaux à partir d'une racine, mais nativement, ce n'est pas possible. Pas eu trop le temps de me pencher là-dessus ces derniers jours.


    Il est normal également que Folder.Files ne récupère pas les dossiers vides puisque son but est de combiner les fichiers. Ca ne sert à rien pour Power Query de lister des dossiers dans lesquels il n'y a rien à combiner . Perso, je me dirigerais plus vite vers une fonction récursive en VBA.


    Mais ce serait un chouette challenge d'arriver à créer une fonction PQ récursive pour les traitements de ce genre.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #4
    Membre émérite
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 055
    Points : 2 518
    Points
    2 518
    Par défaut
    Bonjour

    la récursivité dans Power Query est possible avec @ (voir https://docs.microsoft.com/fr-fr/pow...spec-functions)

    A partir d'une liste de dossier, il est donc possible de récupérer la liste de tous leurs sous-dossiers et ce autant de fois que nécessaire jusqu'à ce qu'il n'y ait plus de sous-dossier.

    Exemple d'une fonction que j'ai nommée Fn_sous_dossier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    (Liste_Dossier as list) => 
    let
    Liste_sous_dossiers =     
        Table.AddColumn(
            Table.SelectRows(
                Table.Combine(
                    List.Transform(
                        Liste_Dossier,
                        each Folder.Contents(_)
                        )
                    ),
                each [Attributes][Directory]
                ),
            "Chemin_Complet",
            each [#"Folder Path"]&[Name]
            )           
    [Chemin_Complet]
     
    in 
    if List.IsEmpty(Liste_sous_dossiers) 
    then Liste_Dossier
    else Liste_Dossier & @Fn_sous_dossier(Liste_sous_dossiers)

    La même Fn_sous_dossier2 mais avec des étapes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (Liste_Dossier as list) => 
    let
    Contenu_Dossier = List.Transform(Liste_Dossier, each Folder.Contents(_)),
    Ajout_Table =Table.Combine(Contenu_Dossier),
    Filtre_ligne_dossier = Table.SelectRows(Ajout_Table, each [Attributes][Directory]),
    Concaténation_Chemin_Nom = Table.AddColumn(Filtre_ligne_dossier, "Chemin_Complet",each [#"Folder Path"]&[Name]),
    Liste_Sous_Dossiers = Concaténation_Chemin_Nom[Chemin_Complet]
     
    in 
    if List.IsEmpty(Liste_Sous_Dossiers) 
    then Liste_Dossier
    else Liste_Dossier & @Fn_sous_dossier2(Liste_Sous_Dossiers)
    Explication :
    - je pars d'une liste de dossier
    - avec List.Transform et Folder.Contents je récupère une table pour chaque dossier (table qui contient les noms et attributs de chaque fichiers + sous-dossiers)
    - je combine toutes les tables obtenues pour chaque élément de la liste
    - je filtre sur les lignes qui correspondent aux sous-dossiers ([Attributes][Directory] = TRUE)
    - j'ajoute une colonne qui concatène la colonne "Folder Path" et celle "Name"
    - enfin je récupère cette nouvelle colonne sous forme de liste.
    J'obtiens ainsi tous les sous-dossiers de tous les dossiers initaux.

    il ne me reste plus qu'à gérer la récursivité :
    si la liste obtenue est vide, c'est que j'arrive en bas de mon arborescence : je renvoie la liste précédente
    sinon, je concatène la liste de départ avec ma fonction ayant comme argument la liste des sous-dossiers


    Soit un Tableau1 contenant un champ "Dossier" avec le chemin de mon ou mes dossiers à tester :
    j'obtiens l'ensemble de l'arborescence des sous-dossiers avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let
        Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
        #"Fonction personnalisée appelée" = Table.AddColumn(Source, "Fn_sous_dossier", each Fn_sous_dossier({[Dossier]})),
        #"Fn_sous_dossier développé" = Table.ExpandListColumn(#"Fonction personnalisée appelée", "Fn_sous_dossier")
    in
        #"Fn_sous_dossier développé"
    les { } sont importantes car la fonction attend une liste comme argument

    Cordialement

    Stéphane

  5. #5
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Merci Stéphane
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Membre émérite
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 055
    Points : 2 518
    Points
    2 518
    Par défaut
    Merci Pierre du retour

    En complément, focalisé sur ce challenge, je n'ai pas répondu à la question initiale du nombre de fichiers par dossier

    donc
    fusionner la liste de tous les sous-dossiers avec un Folder.Files sur le dossier initial préalablement regroupé par "Folder Path" afin de compter les lignes de chacun (les dossiers absents du Folder.Files seront ainsi à 0)

    sinon, un Folder.Contents sur chaque sous-dossier et compter les lignes qui ne sont pas des dossiers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        each
        Table.RowCount(
            Table.SelectRows(
                Folder.Contents([Fn_sous_dossier]),
                each not [Attributes][Directory]
                )
            )
        )
    Stéphane

  7. #7
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Super.

    On va bientôt mettre tout cela en musique en regroupant ce qui touche Power Query.

    Merci pour ta participation et ton partage de connaissances.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2015
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2015
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    Bonjour à tous,

    Quel engouement !!
    Avec tout ça y'a plus qu'à se mettre au travail
    Merci pour votre aide, je vous tiens informés.

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/11/2012, 12h01
  2. Lister les dossiers et sous dossiers
    Par alexandreS dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/09/2010, 18h44
  3. Lister les dossiers et sous dossiers
    Par alexandreS dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/09/2010, 07h41
  4. AIR lister les dossiers.. et les sous dossiers
    Par tininou dans le forum Flex
    Réponses: 2
    Dernier message: 23/12/2008, 13h08
  5. [VB6]lister les dossiers et sous dossier
    Par Jacen dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 28/04/2006, 08h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo