我正在尝试转换IF
语句,如下所示
SET RESULT = IF(C>(X-2), (A+B), C) //IF C< X-2 return A+B otherwise return C
到下面的条件语句
SET RESULT = C>(X-2)?(A+B):C
我编写了一个代码,用于扫描整个字符串以及IF
,(
和,
的出现情况。当有多个IF
语句(如下面的
SET RESULT = IF(C>(X-2), IF(P>C,2,3),C)
这是代码......
string data = "SET RESULT=IF(C>(X-2), (A+B), C)";
string output = string.Empty;
int indexofIF = data.IndexOf("IF");
int obCount = 0;
int cbCount = 0;
if (indexofIF > -1)
{
string script = data.Substring(indexOfIF, (data.Length-indexOfIF-1))
for(int index=0; index<script.Length; index++)
{
int obIndex = data.IndexOf('(', index);
if(obIndex>-1)
obCount++;
int cbIndex = data.IndexOf(')', index);
if(cbIndex>-1)
cbCount++;
if(obCount==cbCount)//Found the end of If statement
{
string tempData = data.Substring(0, index);
int count = tempData.Count(f => f == ',');//Get the number of occurences of ','
if (count == 2)//There are only 2 commas
{
int firstIndex = tempData.IndexOf(',');
int lastIndex = tempData.LastIndexOf(',');
string condtion = tempData.Substring(3, (firstIndex - 4));
string trueCond = tempData.Substring(firstIndex + 1, (lastIndex - firstIndex - 1));
string falseCond = tempData.Substring(lastIndex + 1, (index - lastIndex - 1));
output = condtion + "?" + trueCond + ":" + falseCond;
}
else //More than 2 commas
{
}
}
}
}
我不确定这是否适用于复杂的情况。有没有更好的其他方式这样做?也许使用regex
或任何其他字符串替换操作..
答案 0 :(得分:0)
你走在正确的轨道上。
我会:
也许使用正则表达式或任何其他字符串替换操作..
(IF.*?(?=IF|$))
分解多个IF语句,但它不处理额外的解析,并要求输入数据遵循严格的结构。跟踪括号是棘手/不可能的(请参阅对此答案的评论),并且更容易由状态机处理。
就个人而言,我喜欢逐字符解析的控制/灵活性。像Code Mirror这样的工具使用这种方法来解析源代码。
一旦成功提取了字符串的一部分(例如,将A + B > C
之类的公式解构为其部分),您可能会发现正则表达式很有用。