SSIS 运行 字符串作为表达式
SSIS Run string as Expression
我已经用相应的值替换了公式,最后得到了一大列:
8/4
8+4
9*84
48/74
(8+5)/7
(4*150,5)/(8,05/4,08)
我需要将这些字符串 (WSTR) 作为正则表达式处理,以一个数值结尾。
最初这是在 VBA 中使用 eval 函数完成的。
---自回答以来编辑:
不得不承认我总是避免使用脚本组件,因为我从来没有让它工作过。
我现在试了,用你的 link 得到了这个代码:
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
Row.OutM01 = Evaluate(Row.M01);
}
static double Evaluate(string expression)
{
var loDataTable = new DataTable();
var loDataColumn = new DataColumn("Eval", typeof(double), expression);
loDataTable.Columns.Add(loDataColumn);
loDataTable.Rows.Add(0);
return (double)(loDataTable.Rows[0]["Eval"]);
}
然而,指定的转换无效或语法错误是我唯一遇到的问题。
在脚本组件中使用 C#,您可以通过多种不同的方式评估字符串:Evaluating string "3*(4+2)" yield int 18
编辑:
使用上述 link 中不需要外部 framework/library:
的解决方案之一
在您的 ScriptComponent 中,将 Input0_ProcessInputRow(Input0Buffer Row) 方法替换为:
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
Row.Formula = Evaluate(Row.Formula).ToString();
}
static double Evaluate(string expression)
{
var loDataTable = new DataTable();
var loDataColumn = new DataColumn("Eval", typeof(double), expression);
loDataTable.Columns.Add(loDataColumn);
loDataTable.Rows.Add(0);
return (double)(loDataTable.Rows[0]["Eval"]);
}
这假设您的输入列中包含表达式,称为 "Formula",并且您已将其定义为可以写入脚本组件的 InputColumn:
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
//Row.M01 = Evaluate(Row.INM01);
if (Row.INM01 == null)
{
//Row.M01 = null;
}
else
{
string s = Row.INM01;
s = s.Replace(",", ".");
Row.M01 = Evaluate(s);
}
}
static double Evaluate(string expression)
{
DataTable MyTable = new DataTable();
DataColumn MyColumn = new DataColumn();
MyColumn.ColumnName = "MyColumn";
MyColumn.Expression = expression;
MyColumn.DataType = typeof(double);
MyTable.Columns.Add(MyColumn);
DataRow MyRow = MyTable.NewRow();
MyTable.Rows.Add(MyRow);
return (double)(MyTable.Rows[0]["MyColumn"]);
}
原来我不得不用点替换逗号。
我已经用相应的值替换了公式,最后得到了一大列:
8/4
8+4
9*84
48/74
(8+5)/7
(4*150,5)/(8,05/4,08)
我需要将这些字符串 (WSTR) 作为正则表达式处理,以一个数值结尾。
最初这是在 VBA 中使用 eval 函数完成的。
---自回答以来编辑:
不得不承认我总是避免使用脚本组件,因为我从来没有让它工作过。
我现在试了,用你的 link 得到了这个代码:
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
Row.OutM01 = Evaluate(Row.M01);
}
static double Evaluate(string expression)
{
var loDataTable = new DataTable();
var loDataColumn = new DataColumn("Eval", typeof(double), expression);
loDataTable.Columns.Add(loDataColumn);
loDataTable.Rows.Add(0);
return (double)(loDataTable.Rows[0]["Eval"]);
}
然而,指定的转换无效或语法错误是我唯一遇到的问题。
在脚本组件中使用 C#,您可以通过多种不同的方式评估字符串:Evaluating string "3*(4+2)" yield int 18
编辑: 使用上述 link 中不需要外部 framework/library:
的解决方案之一在您的 ScriptComponent 中,将 Input0_ProcessInputRow(Input0Buffer Row) 方法替换为:
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
Row.Formula = Evaluate(Row.Formula).ToString();
}
static double Evaluate(string expression)
{
var loDataTable = new DataTable();
var loDataColumn = new DataColumn("Eval", typeof(double), expression);
loDataTable.Columns.Add(loDataColumn);
loDataTable.Rows.Add(0);
return (double)(loDataTable.Rows[0]["Eval"]);
}
这假设您的输入列中包含表达式,称为 "Formula",并且您已将其定义为可以写入脚本组件的 InputColumn:
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
//Row.M01 = Evaluate(Row.INM01);
if (Row.INM01 == null)
{
//Row.M01 = null;
}
else
{
string s = Row.INM01;
s = s.Replace(",", ".");
Row.M01 = Evaluate(s);
}
}
static double Evaluate(string expression)
{
DataTable MyTable = new DataTable();
DataColumn MyColumn = new DataColumn();
MyColumn.ColumnName = "MyColumn";
MyColumn.Expression = expression;
MyColumn.DataType = typeof(double);
MyTable.Columns.Add(MyColumn);
DataRow MyRow = MyTable.NewRow();
MyTable.Rows.Add(MyRow);
return (double)(MyTable.Rows[0]["MyColumn"]);
}
原来我不得不用点替换逗号。