Was ist der richtige/effiziente Weg, um Daten zu filtern und dynamische Spaltennamen zu verwenden?Ich arbeite derzeit an einem Skript, das die Datentabelle mit Get Rows Where filtert
Dann verwende ich die Zeilen, um die Werte in einer Liste zu erhalten.
Unten ist ein Teil meines Skripts:
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];Ich würde gerne wissen:
- Gibt es einen besseren Weg, dies zu tun?
- Warum ist As Column() langsam im Vergleich zur direkten Verwendung von :?
- Ich verwende As Column, weil ich es so gemacht habe, dass ich bestimmte Spalten auf einer GUI zuweisen kann
Betreff: Was ist der richtige/effiziente Weg, um Daten zu filtern und dynamische Spaltennamen zu verwenden?Das Beispiel von @txnelson kann (IMO) vereinfacht werden, indem auch die verwendet wird EvalEinfügen Funktion: Dies ermöglicht die Variablensubstitution basierend auf dem Caret-Symbol (^).Zusätzlich die Notation \[ ...]\ kann verwendet werden, damit Anführungszeichen verwendet werden können, ohne Escape-Sequenzen verwenden zu müssen.Letztlich kann man also schreiben:
Eval(Parse(EvalInsert("\[
rows = main_dt << Get Rows Where(
:^G_TEMP_COL_STR^ == "^M_TEMP^" &
:^G_WAFER_COL_STR^ == "^M_WAFER^"
);
]\")));
Dieser Codestil könnte auch verwendet werden, um auf die Spalte zu verweisen
values_list = main_dt:Eval(G_VALUE_COL_STR)[rows]
Aber ich bin mir nicht sicher, warum Sie nicht einfach schreiben können:
values_list = column(main_dt,G_VALUE_COL_STR)[rows];
Betreff: Was ist der richtige/effiziente Weg, um Daten zu filtern und dynamische Spaltennamen zu verwenden?Danke @txnelson ! Ja, es wird ungefähr 50 Mal oder öfter aufgerufen und das hängt von der Anzahl der Kombinationen von Wafer, Temperatur und vcc (hinzugefügt) ab. Ich habe die gleiche Leistung mit dem obigen Code erhalten. Tatsächlich habe ich es auch versucht
main_dt:Eval(G_TEMP_COL_STR) == M_TEMP
aber es ist immer noch merklich langsamer im Vergleich zu Doing
:temperature = M_TEMP
Ich denke, es muss die Bewertungszeichenfolge sein, die es verlangsamt.
Ich habe eine "faule/lausige" Problemumgehung durchgeführt, ich habe die beibehalten
Get Rows Where( :temperature == M_TEMP ...)
Und habe die Spalte, die ich in der GUI ausgewählt habe, in Temperatur umbenannt, um sie anzupassen.
As Column(dlg_ret[2]) << Set Name( "temperature" );
Es funktioniert erwartungsgemäß schnell, benennt jedoch die Spaltennamen um.
Betreff: Was ist der richtige/effiziente Weg, um Daten zu filtern und dynamische Spaltennamen zu verwenden?Sie geben mir nicht genug Informationen, um Ihnen zu sagen, ob es einen besseren Weg gibt."Get Rows Where" ist sehr effizient, es sei denn, Sie verwenden es häufig.Es durchläuft die Daten vollständig, um seine Ergebnisse zu erhalten.Wenn Sie dies häufig tun, ist es möglicherweise besser, eine andere Methode zu verwenden, die die Anzahl der vollständigen Datenscans reduziert.
Sie haben angegeben, dass die Verwendung von As Column() langsamer ist als die Verwendung eines direkten Verweises auf einen Spaltennamen.Wenn Sie dies festgestellt haben, können Sie Ihren Code wie folgt ändern.Es wird eine fest codierte Version von Get Rows Where() an JSL übergeben.
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];" ));