過濾數據+使用動態列名的正確/有效方法是什麼?我目前正在編寫一個腳本,該腳本使用 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 /><BR />values_list = main_dt:(Eval(G_VALUE_COL_STR))[rows];我想知道:
- 有更好的方法嗎?
- 為什麼 As Column() 比直接使用 : 慢?
- 我使用 As Column 是因為我這樣做是為了在 GUI 上分配特定的列
回复:過濾數據+使用動態列名的正確/有效方法是什麼?給出的例子@txnelson也可以通過使用來簡化(IMO)評估插入功能:這允許基於插入符號 (^) 的變量替換。另外符號\[ ...]\可以使用,這樣就可以在不使用轉義序列的情況下使用引號。所以最終可以寫成:
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];
回复:過濾數據+使用動態列名的正確/有效方法是什麼?謝謝@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" );
它按預期工作得很快,但重命名了列名。
回复:過濾數據+使用動態列名的正確/有效方法是什麼?您沒有提供足夠的信息讓我告訴您是否有更好的方法。“Get Rows Where”非常有效,除非您經常使用它。它會完整地傳遞數據以獲得結果。如果您經常這樣做,最好使用其他方法來減少完整數據掃描的次數。
您聲明使用 As Column() 比使用對列名的直接引用要慢。如果那是您確定的,您可以將代碼更改為以下內容。它會將您的 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];" ));