regex

2015-09-03 9 views
5

का उपयोग कर wolfram गणित में एक्सेल फॉर्मूला को कनवर्ट करना मैं Excel फ़ाइलों को आयात कर रहा हूं और इन फ़ाइलों में सूत्रों को निकालने के लिए उन परीक्षणों को निष्पादित कर रहा हूं जो Excel नहीं कर सकते हैं। हालांकि, ऐसा करने के लिए, मुझे एक्सेल फ़ंक्शन को कुछ ऐसा करने की आवश्यकता है जो गणित का उपयोग कर सके। ये सभी सूत्र बहुत बड़े हैं (औसत 200+ पृष्ठों पर), इसलिए मैन्युअल रूप से कनवर्ट करना एक विकल्प नहीं है। यह मुझे मेरी वर्तमान समस्या में लाता है। सूत्रों मैं जिसके परिणामस्वरूप, एक्सेल कार्यों के भीतर कोष्ठक शामिल कन्वर्ट करने के लिए स्थितियों में इस तरह की जरूरत से कुछ: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)) 
यहाँ

मैं बदले बिना [] करने के लिए सभी() से अगर और ऍक्स्प कार्यों कन्वर्ट करने के लिए की आवश्यकता होगी जैसे भागों (ए 2 + बी 2)।

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

वहाँ एक regex कि इन स्थितियों से मिलान कर सकते है: लक्ष्य यह कन्वर्ट करने के लिए है?

+0

* ये सभी सूत्र बहुत बड़े हैं (औसत 200+ पृष्ठों पर) * गंभीरता से !! 200 से अधिक पृष्ठों का एक सूत्र लंबा है। यहां तक ​​कि प्रति पेज एक मामूली 1000 वर्णों पर भी मुझे आश्चर्य है कि एक्सेल भी स्टोर कर सकता है, इस तरह के फॉर्मूला का अकेला उपयोग कर सकता है। –

+1

रोमन मदर की किताबों में से एक, 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 , बताता है कि गणित में LISP अभिव्यक्तियों की व्याख्या कैसे करें। और गणित में डीएसएल को लागू करने के नेट पर बहुत से उदाहरण हैं। Excel अभिव्यक्तियों की व्याख्या करने के लिए कुछ गणित लिखना मजेदार हो सकता है। यह विफल होने पर, गणित की अपनी स्ट्रिंग-हैंडलिंग सुविधाएं (regexes और अधिक) आपके उद्देश्य के प्रयास में बहुत अच्छी और निश्चित रूप से उपयोगी हैं। अब तक तुमने क्या प्रयास किये हैं ? –

+1

प्रासंगिक: http://stackoverflow.com/q/7898310/1004168 – agentp

उत्तर

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

इस बारे में क्या:

[email protected]; 

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

enter image description here

+0

यह काम करता है, यह वही है जो मुझे चाहिए! धन्यवाद! – Soviras

+0

@ सोविरास ग्रेट, लेकिन ध्यान रखें कि यह बहुत ही सरल उदाहरण है। यह विफल हो सकता है जब आपके पास चेक के अंदर स्ट्रिंग में "(" या ")" होता है ताकि शेष चेक विफल हो जाए। सामान्य रूप से अधिक बुलेटप्रूफ पटर की आवश्यकता होती है। लेकिन यह साझा करने के लिए काफी अच्छा है :) – Kuba

+0

प्लस एक अच्छा। पूर्णता के लिए 'IF-> अगर' आदि भी ... – agentp

 संबंधित मुद्दे