Indexation dossiers et sous-dossiers (2)

Bonjour à tous,

Le code en pièce-jointe, développé par yal_excel (merci beaucoup à lui ) permet d'indexer les dossiers et sous-dossiers d'une arborescence d'un répertoire importée depuis Power Query.

J'ai créé un tableau tb_F2 qui donne le chemin de chaque fichier à l'aide des index. Exemples : 2.2.CalmarOpalescent.txt, 3.2.2.2.Orque.txt

Dans mon code (chemin du fichier), je cherche à boucler sur l'ensemble des quatre dictionnaires pour éviter d'écrire quatre fois la boucle For Each, mais je ne sais pas comment faire. Pouvez-vous me dire comment l'écrire ?

Dans un deuxième temps, et c'est certainement un peu plus compliqué, j'aimerais généraliser le code pour n'importe quelle arborescence importée. Cela devrait conduire à déclarer un nombre de tableaux dynamiques et de dictionnaires dépendant du nombre de colonnes. Par exemple, le nombre de dictionnaires serait Ubound(tb1) - 3, car il y a trois colonnes qui ne sont pas des dossiers : une un index, une colonne vide et le nom du fichier. N'hésitez pas si vous avez des suggestions.

Merci par avance,

10animaux.xlsm (50.28 Ko)

Bonjour,

quel est le résultat final que tu désires obtenir ?
J'ai l'impression que tout n'est pas utile dans toutes ces feuilles. Si on peut se passer de certaines choses, ça ne sert à rien qu'on s'embête les créer si on fait d'une autre façon.
Dépose un fichier ne montrant que ce qui t'est nécessaire.

Dans mon code (chemin du fichier), je cherche à boucler sur l'ensemble des quatre dictionnaires pour éviter d'écrire quatre fois la boucle For Each, mais je ne sais pas comment faire. Pouvez-vous me dire comment l'écrire ?

pour faire quoi ?
eric

Bonjour Eric,

Dans ma pièce jointe, j'ai supprimé les onglets non nécessaires.

pour faire quoi ?

J'obtiens bien le résultat que je souhaite, mon but est simplement de simplifier le code pour éviter d'écrire x fois la même boucle.

For Each clé In d1
    For i = LBound(tb1, 1) To UBound(tb1, 1)
        If tbF(i, 2) = clé Then: tbF(i, 2) = d1.Item(clé)(1)
    Next
Next
For Each clé In d2
    For i = LBound(tb1, 1) To UBound(tb1, 1)
        If tbF(i, 3) = clé Then: tbF(i, 3) = d2.Item(clé)(2)
    Next
Next
For Each clé In d3
    For i = LBound(tb1, 1) To UBound(tb1, 1)
        If tbF(i, 4) = clé Then: tbF(i, 4) = d3.Item(clé)(3)
    Next
Next
For Each clé In d4
    For i = LBound(tb1, 1) To UBound(tb1, 1)
        If tbF(i, 5) = clé Then: tbF(i, 5) = d4.Item(clé)(4)
    Next
Next

Pour ma deuxième question, je reviendrai avec un exemple plus concret.

12animaux-2.xlsm (41.52 Ko)

Je cherche à savoir si le code est adaptable à nombre de colonnes quelconque.

Merci

Tu as vraiment besoin de ça ?

image

ce n'est pas un résultat intermédaire ?

Je cherche à créer des tables pour une base de données relationnelle. A chaque niveau correspond une table, la table de droite dépend directement de la table de gauche. Dans un modèle E/A, c'est une entité faible qui ne peut exister qu'en relation étroite avec l'entité forte (parente) cf http://sql.bdpedia.fr/conception.html. Entité faible. Donc oui, j'ai besoin de tous les tableaux.

Je ne pourrais pas finir ce soir, et ensuite bien occupé jusqu'à jeudi.

Le dernier tableau de droite est différent dans les 2 fichiers.
Il te faut quoi exactement ?
eric

Bonjour Eric, bonjour à tous

Je suis désolé si je n’ai pas été clair dans ma demande et si vous y avez passé du temps. De nouvelles recherches ont changé ma façon de voir les choses et c’est pourquoi je vais la reformuler.

Reprenons donc à zéro. A partir d’une arborescence de dossiers et de fichiers exportée dans Excel grâce à Power Query, je souhaite créer une table que je pourrais intégrer dans une base de données et effectuer des requêtes en SQL sur celle-ci.

Deux représentations sont possibles :

  1. Prévoir une auto-jointure de la table sur elle-même
  2. Dans cette table, une colonne permet de joindre un élément à son parent. Dans ma pièce jointe, voir l’onglet tb_autoref : les dossiers ARTHROPODES, MOLLUSQUES et VERTEBRES n’ont pas de parent, du coup id_pere vaut 0 ; le dossier CRUSTACES a pour parent ARTHROPODES, id_pere vaut 1, de même le dossier INSECTES a pour parent ARTHROPODES, id_pere vaut 1, etc.
    => Ce modèle n’est pas performant quand l’arbre est profond et les requêtes sont compliquées.
  3. Créer une représentation intervallaire des arborescences
  4. Il s’agit de créer une arborescence avec des intervalles adjacents et recouvrant. A toutes les entrées sont attribuées deux bornes (bg : borne de gauche et bd : borne de droite). L'attribution des valeurs de ces bornes se fait en parcourant l'arbre comme si l'on traçait une ligne pour l'entourer. Dans ma pièce jointe, voir l’onglet arbre, j’ai numéroté les bornes à la main. A partir de cette représentation, j’obtiens les bornes bg et bd et je peux donc remplir ma table (voir onglet tb_interval).
    => Dans ce modèle, les requêtes sont beaucoup plus simples à écrire : toutes les feuilles ont un intervalle de longueur 1, tous les nœuds ont un intervalle supérieur à 1, etc.

    Donc, je cherche un code VBA qui, à partir d’un import d’arborescence (ex. Import), me retourne la table des intervalles (ex. tb_interval), décrite ci-dessus. Est-ce faisable , avez-vous des idées ?

    Je vous en remercie par avance,
11tb-animaux.xlsm (44.95 Ko)

Bonjour,

sans doute. Sauf que je ne comprend rien à tb_interval...
Comment tu calcule bg et bd (1-12, 13-22, 23-74,etc) ?
eric

Il faut regarder dans l'onglet Arbre, les bg et bd sont les numéros de chaque côté du dossier ou du fichier. Vu l'orientation de l'arbre, c'est plutôt en haut et en bas que gauche-droite, le principe reste le même.

Houla, pas simple à appréhender.
Je suppose que la numérotation alternativement de gauche à droite et de droite à gauche est inhérente à ce système et impérative ?
Peut-être qu'un déclic se produira demain, pour l'instant j'ai un peu de mal à voir comment l'aborder simplement.

Et toujours avec la possibilité de plus de profondeur ? Un max est envisageable ?
Cette colonne vide F sera toujours là ou c'est celle destinée à accueillir un niveau supplémentaire unique ?
Je ne te promet rien...
eric

Et toujours avec la possibilité de plus de profondeur ? Un max est envisageable ?Je suppose que la numérotation alternativement de gauche à droite et de droite à gauche est inhérente à ce système et impérative ?

Je ne vois pas très bien ce que tu veux dire. La numérotation se fait suivant "la ligne enveloppant l'arbre", simple à voir graphiquement (je doute que niveau code, c'est une autre paire de manches).

sqltree2 1

Et toujours avec la possibilité de plus de profondeur ? Un max est envisageable ?

Pour l'instant, dans mon dossier parent, il y a environ 2500 dossiers et fichiers, sur 5 niveaux hiérarchiques. Difficile à dire pour le max, on peut dire 5000 éléments, et limiter à 6 le nombre de niveaux si nécessaire.

Cette colonne vide F sera toujours là ou c'est celle destinée à accueillir un niveau supplémentaire unique ?

Alors ça, c'est du PowerQuery. Quand j'importe une arborescence, Power Query me met toujours une cellule non vide (mais qui ne contient rien de visible) dans la cellule adjacente au dernier élément écrit, dans Import, tu peux tester =ESTVIDE(D2), qui renvoie FAUX. Et la cellule à droite de celle-ci est vide =ESTVIDE(D2), celle-ci renvoie VRAI. Il doit y avoir une raison que je ne connais pas.

La colonne F n'est pas vide, je n'ai pas ajouté cette colonne dans un but quelconque.

10tb-animaux.xlsm (100.49 Ko)

Bonjour,

déjà bravo pour les explications, exemples complets et dessins.
Tu n'as pas perdu ton temps, on a gagné de longs échanges en questions/réponses.
C'est rare et ça motive.

Et merci pour cette découverte de représentation d'arbres. C'est très intéressant et prometteur, je vais approfondir.
Sur l'exemple tout est bon, je t'explique quand même le principe utilisé.
Je pense que tous les cas de figure y sont, mais sans certitude. Je préfère que tu réfléchisses à la logique voir si elle te parait complète vu que j'ai été au plus simple :
- je parcours toutes les lignes 2 fois, g à d puis d à g
- à l'aller, si cellule au-dessus différente c'est un bg
- au retour, si cellule en dessous différente c'est un bd

Soit attentif aux premiers arbres réalisés et contrôle, surtout aux extrémités et à la dernière ligne où se nichent les cas particuliers.
eric

Bonjour,

De rien, j'ai essayé d'expliquer du mieux que j'ai pu, le plus dur et de très loin pour moi, c'est le code.

Cette écriture de table va être pratique pour interroger des tables dans la petite BDD que je conçois, trouver par exemple tous les dossiers et fichiers sous un dossier, faire des comptes, etc.

Du coup, bravo Eric pour cet algorithme, je vais le regarder plus en détail, ça va me prendre du temps (remplissage du dict ou les trois boucles If imbriquées pour le remplissage du tableau avec le compteur cpt). J'ai compris que la plage de cellules a été élargie en haut, en bas, à gauche et à droite pour tester des conditions en dehors du tableau de données.

- à l'aller, si cellule au-dessus différente c'est un bg

- au retour, si cellule en dessous différente c'est un bd

Là , je ne suis pas sûr de bien comprendre, j'essaierai demain pour voir ce que cela fait en mode pas à pas.

Petite question : tu as déclaré un tableau tb_int() dans les variables, et après dans le code, c'est t_int(), je pense que c'est une erreur de frappe. En tout cas ça marche, pas de bug même s'il y a le "Option Explicit".

Je vais tester le code sur une arborescence plus complète pour voir s'il y a des bizarreries, en particulier sur les bords.

Merci encore

Bonjour

Là , je ne suis pas sûr de bien comprendre...

Ex : en C2 tu as CRUSTACES, avec autre chose au-dessus (and datas(lig, col) <> datas(lig - 1, col)), à l'aller (If sens = 1), c'est donc un bg.
Et autre chose en-dessous, au retour c'est donc enregistré comme un bd.

En B3 tu as ARTHROPODES au milieu de 2 autres ARTHROPODES, ça ne peut être ni l'un, ni l'autre.
Tu as une fourmi qui se balade sur ton arbre la tête en haut à l'aller, et la tête en bas au retour

Petite question : tu as déclaré un tableau tb_int()...

tu as tout à fait raison. Et oui, c'est étonnant que le compilateur ne m'ait pas insulté.
J'ai tenté plusieurs pistes avant d'arriver à cette forme relativement simple au fil de la compréhension. J'ai dû finir par le perdre :-)
Régularise que ce soit propre.

Le dict n'est là que pour connaitre la position des items dans le tableau, sans avoir besoin de les rechercher.
eric

Bonjour,

Merci eric pour tes explications, je pense maintenant avoir bien compris le principe du code

Cependant, en le déroulant sur un autre arbre, je me suis rendu compte d'une faille qui vient selon moi de la définition de la clé (niveau-nom). Si par exemple, je copie le dossier "CRUSTACES" dans "MOLLUSQUES", je devrais obtenir un nouvel arbre (cf onglet "arbre") avec 2 éléments supplémentaires et donc 4 bords en plus. Or dans le code, il n'y a qu'une clé.

Du coup, il faudrait selon moi redéfinir la clé pour que l'indexation démarre depuis le premier dossier. Comme par exemple 1-1-CRUSTACES est différent de 2-1-CRUSTACES, 1-1-1-CrabeRougeDesGalapagos est différent de 2-1-1-CrabeRougeDesGalapagos. En PJ un fichier pour exemple.

6tb-animaux-2.xlsm (98.13 Ko)

Voilà, si vous avez des solutions pour le code je suis preneur.

Merci !

Bonjour,

j'essaie de voir ça demain, un 1er essai montre ce n'est pas si simple à traiter...
eric

12tb-animaux-2.xlsm (131.99 Ko)

Bonjour,

désolé pour le délai.
En plus de surprises apparaissant au fur et à mesure nécessitant un débogage assez laborieux, j'ai voulu profiter du soleil avant les orages ;-)

En préfixe de la clé j'ai ajouté la position (ligne,colonne) du père (1ère colonne remplie précédente), le père étant la 1ère apparition dans la colonne.
Ref unique aussi, avec l'avantage de ne pas devoir parcourir et ajouter tout le chemin.
Fait dans une fonction séparée car ça commençait à se compliquer un peu.

J'ai l'impression que c'est bon. Je te laisse contrôler en détail.
eric

Bonjour Eric,

Pas de soucis, je n'ai pas d'empressement. Chez moi, encore une journée de beau temps, ça tombe ce soir ;)

Merci pour le code, je vais prendre le temps de regarder et tester.

Bon week-end

Rechercher des sujets similaires à "indexation dossiers"