【问题标题】:Converting excel formula to wolfram mathematica using regex使用正则表达式将 excel 公式转换为 wolfram mathematica
【发布时间】:2015-09-03 11:30:34
【问题描述】:

我正在导入 Excel 文件并提取这些文件中的公式以执行 Excel 无法执行的各种测试和计算。但是,为此,我需要将 Excel 函数转换为 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]]

有没有可以匹配这些情况的正则表达式?

【问题讨论】:

  • 所有这些公式都非常大(平均 200 多页) 说真的!一个超过 200 页的公式。即使每页只有 1000 个字符,我也很惊讶 Excel 甚至可以存储,更不用说使用这样的公式了。
  • Roman Mader 的一本书,amazon.co.uk/Mathematica-Programmer-Stephen-Wolfram/dp/…,解释了如何在 Mathematica 中解释 LISP 表达式。在 Mathematica 中实现 DSL 的网络上有很多例子。编写一些 Mathematica 来解释 Excel 表达式可能会很有趣。如果做不到这一点,Mathematica 自己的字符串处理工具(正则表达式等)非常好,并且肯定有助于实现您的目标。到目前为止,您尝试过什么?
  • 你的例子中括号不平衡(9左8右)
  • @High Performance Mark excel 能适应这么大的公式的原因是它被分割成大量的单元格。如果有任何变化并且 excel 重新计算它,程序会冻结很长时间,这也是我想将它导入 Mathematica 的原因之一。我尝试使用以下正则表达式及其变体: (.*?\(.*?\)(.?)*?)*?这导致了一些问题,其中它不匹配某些应该匹配的部分或匹配不应该匹配的部分。

标签: regex excel wolfram-mathematica


【解决方案1】:
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 @ %

【讨论】:

  • @Soviras 很好,但请记住,这是一个非常简单的示例。当您在检查中的字符串中包含“(”或“)”时,它可能会失败,因此余额检查将失败。一般来说,需要更多的防弹模式。但这已经足够好分享了:)
猜你喜欢
  • 2011-10-02
  • 2016-04-02
  • 1970-01-01
  • 2019-05-11
  • 2014-11-08
  • 2017-12-29
  • 2023-03-09
  • 2013-06-26
相关资源
最近更新 更多