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

Python Discussion :

Extraction des paramètres d'une formule


Sujet :

Python

  1. #1
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 007
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 007
    Points : 9 401
    Points
    9 401
    Par défaut Extraction des paramètres d'une formule
    Hello,
    dans un forum VBA voici le problème qui est posé :
    Exemple de formule à traiter:"=FOO(((A),(B),"C"),"D,E,F",((G),H))"
    Pour simplifié j'ai mis des lettres à la place des valeurs
    A, B , C, E, F G etc = sont des "valeurs paramètres".
    Exemple de ce peut contenir A, B etc.
    A = A1:B2, B5, B7, C8
    B = D5:E12
    C = 9850
    D = Banque, Caisse, Référence -> par exemple.


    Ce qui donnerait en développant:
    "(((A1:B2, B5, B7, C8),(D5:E12),"9850"),"Banque, Caisse, Référence",((G),H))"


    OBJECTIF: Extraire chaque paramètre en gardant sa cohérence.
    Dans la formule ci-dessus les paramètres complets a extraire serait :
    n°1 : ((A),(B),"C")
    N°2 : "D,E,F"
    N°3 : ((G),H))
    MAIS:
    Il peut y avoir imbrication de fonction "Foo()". Comme ceci:
    "=FOO1(((A),(B),"C"),"D,E,F",(FOO2((a),(b),"c"),H))"
    Je serais curieux de savoir si cela est faisable en python. Si vous avez des idées.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 007
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 007
    Points : 9 401
    Points
    9 401
    Par défaut
    il y a le diabolique chatgpt qui m'a proposé une solution avec des expressions régulières qui me semble pas mal fonctionner :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    import re
     
    def extract_params(formula):
        def parse_inside_parentheses(s):
            # Enlever les parenthèses externes
            s = s[1:-1]
     
            # Initialisation
            params = []
            current_param = []
            depth = 0
     
            for char in s:
                if char == '(':
                    depth += 1
                elif char == ')':
                    depth -= 1
     
                if char == ',' and depth == 0:
                    params.append(''.join(current_param).strip())
                    current_param = []
                else:
                    current_param.append(char)
     
            if current_param:
                params.append(''.join(current_param).strip())
     
            return params
     
        # Trouver le contenu de FOO
        match = re.match(r'.*?\((.*)\)', formula)
        if not match:
            return []
     
        content = match.group(1)
        params = parse_inside_parentheses(f'({content})')
     
        return params
     
    # Exemple d'utilisation
    formula = '=FOO(((A),(B),"C"),"D,E,F",((G),H))'
    params = extract_params(formula)
    print(params)
    formula = '=FOO(((A1:B2, B5, B7, C8),(D5:E12),"9850"),"Banque, Caisse, Référence",((G),H))'
    params = extract_params(formula)
    print(params)
    formula = '=FOO1(((A),(B),"C"),"D,E,F",(FOO2((a),(b),"c"),H))'
    params = extract_params(formula)
    print(params)
    résultats :
    ['((A),(B),"C")', '"D', 'E', 'F"', '((G),H)']
    ['((A1:B2, B5, B7, C8),(D5:E12),"9850")', '"Banque', 'Caisse', 'Référence"', '((G),H)']
    ['((A),(B),"C")', '"D', 'E', 'F"', '(FOO2((a),(b),"c"),H)']
    qui dit mieux ?
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 190
    Points : 4 627
    Points
    4 627
    Par défaut
    bonjour

    puisque cela ressemble à du python, je triche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import ast
    func = '=FOO(((A),(B),"C"),"D,E,F",((G),H))'
    tree = ast.parse(func.removeprefix("="), mode='eval')
    print(ast.dump(tree, indent=4))
     
    func = '=FOO1(((A),(B),"C"),"D,E,F",(FOO2((a),(b),"c"),H))'
    tree = ast.parse(func.removeprefix("="), mode='eval')
    print(ast.dump(tree, indent=4))
    Mais c'est bien l'idée : regarder du coté des arbres syntaxiques puisque chaque variable peut-être une fonction

    Fonctionne parfaitement avec A, B mais si A == "A1:B2" oops ce n'est pas du python, il faut détecter les ":" et quotter l'expression avant évaluation pour simuler une chaine ?

    ------

    Dans ton ordre d'idée, j'ai demandé au miaou:
    peux-tu écrire un code python pour évaluer une chaine `=FOO1(((A),(B),"C"),"D,E,F",(FOO2((a),(b),"c"),H))` avec un arbre syntaxique.
    FOO et FOO1 sont des noms de fonction qui peuvent varier.
    les variables A, a, B, b, C, c, d, e , f, h peuvent être des entiers, des chaine ou de la forme `A1:C45` ou bien `A1:B2, B5, B7, C8`
    Chaque variable peut-être remplacée par une fonction dans la chaine à évaluer.
    Il pond du code (il parle de cellules ! donc il a bien une petite intelligence quand même Pourquoi j'ai oublié de lui dire que l'expression était une formule excel ? heureusement qu'il est moins bête que moi.)
    Citation Envoyé par miaou
    Ce code est maintenant capable de gérer les variables sous forme d'entiers, de chaînes de caractères, de plages de cellules et de listes de cellules, en construisant et évaluant correctement l'arbre syntaxique.
    mais j'ai la flemme de tester sa solution
    $moi= ( !== ) ? : ;

  4. #4
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 007
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 007
    Points : 9 401
    Points
    9 401
    Par défaut
    merci papajoker pour ton intervention, ben en fait ce que m'a pondu miaou gpt m'a servi à écrire le code qui devait être en vba. C'est l'idée de balayer les caractères de la formule en testant le niveau de profondeur des parenthèses que j'ai utilisé en ajoutant aussi celui des guillemets qui n'y était pas dans le code de miaou gpt (les résultats dans mon message précédent ne sont pas tous bons).
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. vc++(6)+extraction des données dans une image(.tif)
    Par spootnic22 dans le forum Visual C++
    Réponses: 1
    Dernier message: 22/11/2006, 16h14
  2. extraction des données dans une table Access
    Par moabomotal dans le forum Access
    Réponses: 2
    Dernier message: 26/05/2006, 11h17
  3. [Vidéo] Extraction des frames d'une vidéo
    Par jacques_henry dans le forum Multimédia
    Réponses: 1
    Dernier message: 23/01/2006, 20h32
  4. Extraction des frames d'une vidéo
    Par jacques_henry dans le forum C++
    Réponses: 6
    Dernier message: 05/01/2006, 18h46

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