2015-09-03 16 views
5

Importando file Excel ed estraendo le formule in questi file per eseguire vari test e calcoli con loro che Excel non può eseguire. Tuttavia, per farlo, ho bisogno di convertire le funzioni di Excels in qualcosa che Mathematica può usare. Tutte queste formule sono molto grandi (in media oltre 200 pagine), quindi la conversione manuale non è un'opzione. Questo mi porta al mio problema attuale. Alcune delle formule di cui ho bisogno per convertire contenere parentesi all'interno delle funzioni di Excel, con conseguente in situazioni come questa:Conversione della formula excel in wolfram mathematica utilizzando regex

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)) 

Qui avrei bisogno di convertire tutti i() dalle funzioni IF e EXP per [] senza cambiare parti come (A2 + B2). L'obiettivo è quello di convertirlo in:

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]] 

C'è un'espressione regolare che può abbinare queste situazioni?

+0

* Tutte queste formule sono molto grandi (in media più di 200 pagine) * Seriamente !! una formula lunga più di 200 pagine. Anche con un modesto 1000 caratteri per pagina sono stupito che Excel possa persino memorizzare, per non dire usare, una formula del genere. –

+1

Uno dei libri di Roman Mader, http://www.amazon.co.uk/Mathematica-Programmer-Stephen-Wolfram/dp/0124649904/ref=sr_1_5?s=books&ie=UTF8&qid=1441282579&sr=1-5&keywords=roman+maeder , spiega come interpretare le espressioni LISP in Mathematica. E ci sono molti esempi sulla rete di implementazione di una DSL in Mathematica. Potrebbe essere divertente scrivere qualche Mathematica per interpretare le espressioni di Excel. In caso contrario, le strutture di gestione delle stringhe proprie di Mathematica (regex e altro) sono molto buone e sicuramente utili per raggiungere il tuo obiettivo. Cosa hai provato fino ad ora ? –

+1

rilevante: http://stackoverflow.com/q/7898310/1004168 – agentp

risposta

5
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))" 

Che dire di questo:

[email protected]; 

rectBrackets := StringReplace[ #, 
    (f_?UpperCaseQ ~~ fr : LetterCharacter ..) ~~ 
    "(" ~~ Shortest[content__] ~~ ")" /; (
     StringCount[content, ")"] == StringCount[content, "("] 
    ) :> (
     f <> ToLowerCase[fr] <> "[" <> rectBrackets @ content <> "]" 
    ) 
] &; 

operators = StringReplace[#, {"=" -> "==", "<>" -> "!="}] &; 

E ora cerchiamo di usarle:

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 @ % 

enter image description here

+0

Funziona, è esattamente ciò di cui avevo bisogno! Grazie! – Soviras

+0

@Soviras Ottimo, ma tieni presente che questo è un esempio molto semplice. Potrebbe non riuscire quando si ha "(" o ")" nelle stringhe all'interno dei controlli in modo che il controllo del saldo fallisca. In generale, sono necessari altri picchi di piombo. Ma questo è abbastanza bello da condividere :) – Kuba

+0

più uno bello. per completezza fare 'IF-> If' ecc ... – agentp

Problemi correlati