Bonjour !

Je veux coder un algorithme qui pourrait transformer un affichage hiérarchique d'un arbre dans un fichier xlsx en une structure de données arborescente. Le problème étant que malgré la hierarchie bien faites du fichier donné c'est plein de trous ... comme un gruyère

Voici l'apperçu des données que l'on peut trouver entières ici :

Nom : 1IIZH.png
Affichages : 195
Taille : 221,9 Ko

Et un exemple sous format réduit :

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
SIC,,,
,,,
Division 1 : Mammals,,,
0100,felines,,
0110,,cats,
0111,,,Abyssinian
0112,,,Aegan
0113,,,American Curl
0120,,tiger,
0121,,,Indochinese tiger 
0122,,,Bengal tiger
Divison 2 : Reptiles,,,
1100,crocodilians,,
1110,,crocodiles,
1111,,,caïman
1200,testudines,,
1210,,tortoises,
1211,,,capucine
J'ai commencé à faire un pseudo code, mais je pense que ce n'est pas optimal... D'autant plus que l'on m'a glissé que les DataFrame multiindex étaient plus efficaces mais je ne sais pas encore m'en servir. Un autre m'a conseillé ElasticSearch mais pareil, c'est trop neuf pour moi.


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
23
24
25
26
27
28
 
from openpyxl import load_workbook
import pandas as pd
 
wb = load_workbook(filename='Trees.xlsx')
 
i = 0
division = 0
niveau = 0
typesDejaVus = []
for cell in wb['Industry']['A']:
    if "Division" in cell
         #je dois créer un noeud père
         division +=1
    if cell.type() == int:
        # Si le chiffre au niveau [niveau +1] dans l'indicatif à quatre chiffre n'a pas déjà été vu c'est un noeud fils
        if (cell[niveau +1]  not in typeDejaVu):
            typesDejaVus = typesDejaVus + cell
            # Faire un enfant avec le contenu directement à droite
        # Sinon si le type a déjà été vu c'est que l'on est passé à une nouvelle section
        else if (le chiffre de la cellule au niveau[niveau +1] in typesDejaVus):
            typesDejaVus =[]
            # Faire un enfant avec le noeud suivant
        # sinon c'est qu'on fait face à une cellule vide
        else :
            nombreDeCellulesVidesLues +=1
    if nombreDeCellulesVidesLues <3:
         break
PS : Le titre est volontairement un peu provocateur mais traduit néanmoins l'essentiel du problème