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 :
Et un exemple sous format réduit :
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 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
PS : Le titre est volontairement un peu provocateur
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: breakmais traduit néanmoins l'essentiel du problème
Partager