筛选数据+使用动态列名的正确/有效方法是什么?我目前正在研究使用Get Rows Where过滤数据表的脚本
然后,我使用这些行来获取列表中的值。
以下是我的脚本的一部分:
rows = main_dt << Get Rows Where(
As Column(G_TEMP_COL_STR) == M_TEMP &
As Column(G_WAFER_COL_STR) == M_WAFER
);<BR /><BR />values_list = As Column(main_dt,G_TEMP_COL_STR)[rows];我想知道:
- 有更好的方法吗?
- 与直接使用:<列名>相比,为什么As Column()慢?
- 我之所以使用As Column,是因为我这样做是为了可以在GUI上分配特定的列
回复:筛选数据+使用动态列名的正确/有效方法是什么?您没有提供足够的信息让我告诉您是否有更好的方法。 除非您经常使用它,否则“将行放置在哪里”非常有效。 它对数据进行完整的传递以获取结果。 如果您经常这样做,则最好使用其他方法来减少完整数据扫描的次数。
您指出使用As Column()比使用直接引用Column Name慢。 如果已确定,则可以将代码更改为以下内容。 它将把Get Rows Where()的硬编码版本传递给JSL。
G_TEMP_COL_STR="Height";
M_TEMP =72;
G_WAFER_COL_STR = "WAFER_NUM";
M_WAFER =12;
G_VALUE_COL_STR = "Values";
Eval(Parse("rows = main_dt << Get Rows Where( :" ||
G_TEMP_COL_STR || " == \!"" || Char(M_TEMP) || "\!" & :" ||
G_WAFER_COL_STR || " == " || Char(M_WAFER) || " );
values_list = main_dt:" || G_VALUE_COL_STR || "[rows];" ));
回复:筛选数据+使用动态列名的正确/有效方法是什么?谢谢 @txnelson !是的,它被调用了50次或更多次,这取决于晶片,温度和vcc(添加)的组合数量。使用上面的代码,我得到了相同的性能。其实我也试过
main_dt:Eval(G_TEMP_COL_STR) == M_TEMP
但相比做起来仍然明显慢
:temperature = M_TEMP
我认为一定是评估字符串使它变慢了。
我做了“懒惰/糟糕”的解决方法,
Get Rows Where( :temperature == M_TEMP ...)
并将我在GUI中选择的列重命名为与温度匹配的列。
As Column(dlg_ret[2]) << Set Name( "temperature" );
它可以按预期快速运行,但可以重命名列名称。
回复:筛选数据+使用动态列名的正确/有效方法是什么?给出的例子 @txnelson 也可以通过使用评估插入函数:这允许根据插入符号(^)进行变量替换。 另外的符号 \ [...] \ 可以使用,以便可以使用引号,而不必使用转义序列。 因此最终可以编写:
Eval(Parse(EvalInsert("\[
rows = main_dt << Get Rows Where(
:^G_TEMP_COL_STR^ == "^M_TEMP^" &
:^G_WAFER_COL_STR^ == "^M_WAFER^"
);
]\")));
这种样式的代码也可以用来引用列而不是
values_list = main_dt:Eval(G_VALUE_COL_STR)[rows]
但是我不确定为什么你不能只写:
values_list = column(main_dt,G_VALUE_COL_STR)[rows];