File size: 3,309 Bytes
10080df
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# kbis_persons_parser.py
import re

def extract_and_parse_persons(input_file: str = "kbis_extracted.txt") -> dict:
    """
    1. Extrait la section des personnes du K-bis.
    2. Parse gérants et associés avec gestion des deux formats (compact + ligne par ligne).
    Retourne un dictionnaire avec les résultats.
    """
    try:
        with open(input_file, "r", encoding="utf-8") as f:
            full_text = f.read()
    except FileNotFoundError:
        print("Erreur : fichier non trouvé.")
        return {"Gérant(s)": "Erreur", "Associé(s)": "Erreur"}

    # Étape 1 : Isolation de la section personnes
    pattern = r"(Gestion, Direction, Administration, Contrôle, Associés ou Membres)\s+(.*?)\s+(Renseignements sur l['’]établissement principal)"
    match = re.search(pattern, full_text, re.I | re.DOTALL)

    if not match:
        print("Section personnes non trouvée.")
        return {"Gérant(s)": "Non détecté", "Associé(s)": "Non détecté"}

    persons_text = match.group(2).strip()

    # Étape 2 : Parsing bi-modulaire
    gerants = []
    associes = []

    # Module 1 : Format compact (Qualité + rôle + Nom dans la même ligne)
    compact_pattern = re.finditer(
        r"Qualité\s+(gérant|Associé)\s+Nom[,;\s]*prénoms?\s*[:;,]?\s*([A-ZÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸ][A-Za-zàâäçéèêëîïôöùûüÿ\s,'’;-]+?)(?:\s+Date et lieu|\s+Nationalité|\s+Adresse|\s+Qualité|$)",
        persons_text,
        re.I
    )
    for m in compact_pattern:
        role = m.group(1).lower()
        name = m.group(2).strip().rstrip(";,.")
        if "gérant" in role:
            gerants.append(name)
        else:
            associes.append(name)

    # Module 2 : Format ligne par ligne (en-tête répété + ligne "Associé NOM...")
    lines = [line.strip() for line in persons_text.split("\n") if line.strip()]
    i = 0
    while i < len(lines):
        line = lines[i]
        if re.search(r"Qualité\s+Nom[;,]?\s*prénoms?\s+Date et lieu de naissance\s+Nationalité\s+Adresse", line, re.I):
            i += 1
            if i < len(lines):
                next_line = lines[i]
                standalone_match = re.match(
                    r"(gérant|Associé)\s*([A-ZÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸ][A-Za-zàâäçéèêëîïôöùûüÿ\s,'’;-]+)",
                    next_line,
                    re.I
                )
                if standalone_match:
                    role = standalone_match.group(1).lower()
                    name = standalone_match.group(2).strip().rstrip(";,.")
                    if "gérant" in role:
                        gerants.append(name)
                    else:
                        associes.append(name)
        i += 1

    # Déduplication tout en conservant l'ordre d'apparition
    gerants = list(dict.fromkeys(gerants))
    associes = list(dict.fromkeys(associes))

    result = {
        "Gérant(s)": ", ".join(gerants) if gerants else "Non détecté",
        "Associé(s)": ", ".join(associes) if associes else "Non détecté"
    }

    # Affichage propre
    print("=== RÉSULTAT FINAL ===")
    for key, value in result.items():
        print(f"{key}: {value}")

    return result

# === EXÉCUTION ===
if __name__ == "__main__":
    extract_and_parse_persons("kbis_extracted.txt")