Qual è il modo corretto / efficiente per filtrare i dati + l'uso di nomi di colonne dinamici?Attualmente sto lavorando a uno script che filtra la tabella dei dati utilizzando Ottieni righe dove
Quindi uso le righe per ottenere i valori in un elenco.
Di seguito è parte della mia sceneggiatura:
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];Mi piacerebbe sapere
- C'è un modo migliore per farlo?
- Perché As Column () è lento rispetto all'utilizzo diretto di: ?
- Sto usando As Column perché l'ho creato in modo da poter assegnare colonne specifiche su una GUI
Ri: Qual è il modo corretto / efficiente per filtrare i dati + l'uso di nomi di colonne dinamici?Non mi stai fornendo informazioni sufficienti per dirti se esiste un modo migliore. "Ottieni righe dove" è molto efficiente, a meno che non lo usi molto. Fa un passaggio completo attraverso i dati per ottenere i suoi risultati. Se lo stai facendo molto, potrebbe essere meglio usare un metodo diverso che riduca il numero di scansioni complete dei dati.
Hai dichiarato che l'utilizzo di As Column () è più lento rispetto all'utilizzo di un riferimento diretto a un nome di colonna. Se questo è ciò che hai determinato, puoi modificare il codice nel modo seguente. Passerà a JSL una versione hardcoded di Get Rows Where ().
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];" ));
Ri: Qual è il modo corretto / efficiente per filtrare i dati + l'uso di nomi di colonne dinamici?Grazie @txnelson ! Sì, viene chiamato come 50 o più volte e dipende dal numero di combinazioni di wafer, temperatura e vcc (aggiunto). Ho ottenuto le stesse prestazioni usando il codice sopra. In effetti ho anche provato a farlo
main_dt:Eval(G_TEMP_COL_STR) == M_TEMP
ma è ancora notevolmente più lento rispetto a fare
:temperature = M_TEMP
Penso che debba essere la stringa di valutazione a rallentarla.
Ho fatto una soluzione "pigra / schifosa", ho mantenuto il
Get Rows Where( :temperature == M_TEMP ...)
E rinominato la colonna che ho selezionato nella GUI in temperatura per abbinarla.
As Column(dlg_ret[2]) << Set Name( "temperature" );
Funziona velocemente come previsto ma rinomina i nomi delle colonne.
Ri: Qual è il modo corretto / efficiente per filtrare i dati + l'uso di nomi di colonne dinamici?L'esempio fornito da @txnelson può essere semplificato (IMO) anche usando il EvalInsert funzione: consente la sostituzione variabile in base al simbolo del cursore (^). Inoltre la notazione \ [...] \ può essere utilizzato in modo che le virgolette possano essere utilizzate senza dover utilizzare le sequenze di escape. Quindi alla fine è possibile scrivere:
Eval(Parse(EvalInsert("\[
rows = main_dt << Get Rows Where(
:^G_TEMP_COL_STR^ == "^M_TEMP^" &
:^G_WAFER_COL_STR^ == "^M_WAFER^"
);
]\")));
Questo stile di codice può essere utilizzato anche per fare riferimento alla colonna anziché
values_list = main_dt:Eval(G_VALUE_COL_STR)[rows]
Ma non sono sicuro del perché non puoi semplicemente scrivere:
values_list = column(main_dt,G_VALUE_COL_STR)[rows];