使用正则表达式将 excel 公式转换为 wolfram mathematica
Converting excel formula to wolfram mathematica using regex
我正在导入 Excel 文件并提取这些文件中的公式来执行 Excel 无法执行的各种测试和计算。但是,为此,我需要将 Excels 函数转换为 Mathematica 可以使用的函数。所有这些公式都非常大(平均超过 200 页),因此无法手动转换。这让我想到了我目前的问题。
我需要转换的一些公式在 Excel 函数中包含括号,导致出现如下情况:
IF(IF((A2+B2)*(C1+2^D1)<>7,"A","B")="A",C8,D8)*2/IF(G17*G2=G1,IF(EXP(K9)=K10,K11,K12))*EXP(IF(H22+H23=213,A1,B1))
这里我需要将 IF 和 EXP 函数中的所有 () 转换为 [],而不更改 (A2+B2) 等部分。
目标是将其转换为:
IF[IF[(A2+B2)*(C1+2^D1)<>7,"A","B"]="A",C8,D8]*2/IF[G17*G2=G1,IF[EXP[K9]=K10,K11,K12]]*EXP[IF[(H22+H23)=213,A1,B1]]
是否有可以匹配这些情况的正则表达式?
string = "IF(IF((A2+B2)*(C1+2^D1)<>7,\"A\",\"B\")=\"A\",C8,D8)*2/IF(\
G17*G2=G1,IF(EXP(K9)=K10,K11,K12))*EXP(IF(H22+H23=213,A1,B1))"
这个怎么样:
ClearAll@rectBrackets;
rectBrackets := StringReplace[ #,
(f_?UpperCaseQ ~~ fr : LetterCharacter ..) ~~
"(" ~~ Shortest[content__] ~~ ")" /; (
StringCount[content, ")"] == StringCount[content, "("]
) :> (
f <> ToLowerCase[fr] <> "[" <> rectBrackets @ content <> "]"
)
] &;
operators = StringReplace[#, {"=" -> "==", "<>" -> "!="}] &;
现在让我们使用它们:
rectBrackets @ operators @ string
"If[If[(A2+B2)*(C1+2^D1)!=7,\"A\",\"B\"]==\"A\",C8,D8]*2/If[G17*\
G2==G1,If[Exp[K9]==K10,K11,K12]]*Exp[If[H22+H23==213,A1,B1]]"
ToExpression @ %
我正在导入 Excel 文件并提取这些文件中的公式来执行 Excel 无法执行的各种测试和计算。但是,为此,我需要将 Excels 函数转换为 Mathematica 可以使用的函数。所有这些公式都非常大(平均超过 200 页),因此无法手动转换。这让我想到了我目前的问题。 我需要转换的一些公式在 Excel 函数中包含括号,导致出现如下情况:
IF(IF((A2+B2)*(C1+2^D1)<>7,"A","B")="A",C8,D8)*2/IF(G17*G2=G1,IF(EXP(K9)=K10,K11,K12))*EXP(IF(H22+H23=213,A1,B1))
这里我需要将 IF 和 EXP 函数中的所有 () 转换为 [],而不更改 (A2+B2) 等部分。 目标是将其转换为:
IF[IF[(A2+B2)*(C1+2^D1)<>7,"A","B"]="A",C8,D8]*2/IF[G17*G2=G1,IF[EXP[K9]=K10,K11,K12]]*EXP[IF[(H22+H23)=213,A1,B1]]
是否有可以匹配这些情况的正则表达式?
string = "IF(IF((A2+B2)*(C1+2^D1)<>7,\"A\",\"B\")=\"A\",C8,D8)*2/IF(\
G17*G2=G1,IF(EXP(K9)=K10,K11,K12))*EXP(IF(H22+H23=213,A1,B1))"
这个怎么样:
ClearAll@rectBrackets;
rectBrackets := StringReplace[ #,
(f_?UpperCaseQ ~~ fr : LetterCharacter ..) ~~
"(" ~~ Shortest[content__] ~~ ")" /; (
StringCount[content, ")"] == StringCount[content, "("]
) :> (
f <> ToLowerCase[fr] <> "[" <> rectBrackets @ content <> "]"
)
] &;
operators = StringReplace[#, {"=" -> "==", "<>" -> "!="}] &;
现在让我们使用它们:
rectBrackets @ operators @ string
"If[If[(A2+B2)*(C1+2^D1)!=7,\"A\",\"B\"]==\"A\",C8,D8]*2/If[G17*\ G2==G1,If[Exp[K9]==K10,K11,K12]]*Exp[If[H22+H23==213,A1,B1]]"
ToExpression @ %