12

Python を使用して、スプレッドシート xml からフォーミュラ リファレンス マップを作成する作業を行っています。式は

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

writecurve 関数の n 番目の引数を取得することにのみ関心があります。ここでは、基本的に括弧内にないコマをカウントする非常にCスタイルのプログラムを作成します。ネストされた式がたくさんあります

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]

これを行うpythonicの方法はありますか?または、式全体を解析するためのより良い再帰的な方法はありますか? どうもありがとう

4

1 に答える 1

16

私が知っている最高の Excel 数式パーサーは、EW Bachtal のアルゴリズムです。Robin Macharg による Python ポートがあります。私が知っている最新バージョンはpycel プロジェクトの一部ですが、スタンドアロン ( ExcelFormula)で使用できます。式の解析に問題はありません。

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>

その後、AST をたどって WriteCurve ノードを見つけ、その引数を調べることができます。

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'
于 2012-10-17T08:06:48.690 に答える