13 votes

analyse des formules de style Excel

Je travaille sur la construction d'une formule de référence à partir d'une feuille de calcul xml en utilisant python. La formule est la suivante

=IF(AND(LEN(R[-2]C[-1])>0,R[-1]C),WriteCurve(OFFSET(R16C6, 0,0,R9C7,R10C7),R15C6,R10C3, R8C3),"NONE")

Je suis seulement intéressé par l'obtention du nième argument de la fonction writecurve. Ici, j'ai un programme de style C qui compte les virgules qui ne sont pas entre crochets. Il y a beaucoup de formules imbriquées.

def parseArguments(t, func, n):
start=t.find(func)+len(func)+1
bracket = 0
ss = t[start:]
lastcomma = 0
for i, a in enumerate(ss):
    if a=="(":
        bracket +=1
    elif a==")":
        if bracket==0:
            break
        bracket-=1
    elif a == ",":
        if bracket==0 and n==0:
            break
        elif bracket ==0:
            if n-1==0:
                lastcomma = i
            n-=1
if lastcomma == 0:
    return ss[:i]
else:
    return ss[lastcomma+1:i]

Existe-t-il un moyen pythonique de faire cela ? ou existe-t-il une meilleure méthode récursive pour analyser la formule entière ? Merci beaucoup.

17voto

ecatmur Points 64173

Le meilleur analyseur de formules Excel que je connaisse est le suivant E. L'algorithme de W. Bachtal . Il existe un portage Python réalisé par Robin Macharg ; la version la plus récente dont j'ai connaissance fait partie de la base de données de l'Union européenne. projet pycel mais il peut être utilisé de manière autonome. ExcelFormule . Il n'a aucun problème à analyser votre formule :

from pycel.excelformula import ExcelFormula, FunctionNode
formula = ExcelFormula('=IF(AND(LEN(R[-2]C[-1])>0,R[-1]C),WriteCurve(OFFSET(R16C6, 0,0,R9C7,R10C7),R15C6,R10C3, R8C3),"NONE")')
>>> formula.ast
FunctionNode<IF>

Vous pouvez alors parcourir l'AST pour trouver le nœud WriteCurve et examiner ses arguments :

write_curve = next(node for node, _ in formula.ast.descendants if isinstance(node, FunctionNode) and node.value.strip('(') == 'WriteCurve')
>>> write_curve.children[2].value
'R10C3'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X