¿Cuál es la forma adecuada / eficiente de filtrar datos + uso de nombres de columnas dinámicas?Actualmente estoy trabajando en un script que filtra la tabla de datos usando Obtener filas donde
Luego uso las filas para obtener los valores en una lista.
A continuación se muestra parte de mi script:
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];Me gustaría saber:
- ¿Hay una mejor manera de hacer esto?
- ¿Por qué es lenta como columna () en comparación con el uso directo de: ?
- Estoy usando As Column porque lo hice para poder asignar columnas específicas en una GUI
Re: ¿Cuál es la forma adecuada / eficiente de filtrar datos + uso de nombres de columnas dinámicas?No está proporcionando suficiente información para que yo le diga si hay una mejor manera. "Obtener filas donde" es muy eficiente, a menos que lo esté usando mucho. Realiza un pase completo a través de los datos para obtener sus resultados. Si está haciendo esto mucho, podría ser mejor utilizar un método diferente que reduzca el número de escaneos de datos completos.
Declaró que usar As Column () es más lento que usar una referencia directa a un Nombre de columna. Si eso es lo que ha determinado, puede cambiar su código a lo siguiente. Le pasará a JSL una versión codificada de su 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];" ));
Re: ¿Cuál es la forma adecuada / eficiente de filtrar datos + uso de nombres de columnas dinámicas?Gracias @txnelson ! Sí, se llama como 50 o más veces y eso depende del número de combinaciones de oblea, temperatura y vcc (agregado). Obtuve el mismo rendimiento usando el código anterior. De hecho también intenté hacer
main_dt:Eval(G_TEMP_COL_STR) == M_TEMP
pero sigue siendo notablemente más lento en comparación con hacerlo
:temperature = M_TEMP
Creo que debe ser la cadena de evaluación la que lo está ralentizando.
Hice una solución "perezosa / pésima", mantuve el
Get Rows Where( :temperature == M_TEMP ...)
Y renombré la columna que seleccioné en la GUI a temperatura para que coincida.
As Column(dlg_ret[2]) << Set Name( "temperature" );
Funciona rápido como se esperaba pero renombra los nombres de las columnas.
Re: ¿Cuál es la forma adecuada / eficiente de filtrar datos + uso de nombres de columnas dinámicas?El ejemplo dado por @txnelson se puede simplificar (IMO) también usando el EvalInsert función: esto permite la sustitución de variables en función del símbolo de intercalación (^). Además la notación \ [...] \ se puede usar para que las comillas se puedan usar sin tener que usar secuencias de escape. Entonces, en última instancia, es posible escribir:
Eval(Parse(EvalInsert("\[
rows = main_dt << Get Rows Where(
:^G_TEMP_COL_STR^ == "^M_TEMP^" &
:^G_WAFER_COL_STR^ == "^M_WAFER^"
);
]\")));
Este estilo de código también podría usarse para hacer referencia a la columna en lugar de
values_list = main_dt:Eval(G_VALUE_COL_STR)[rows]
Pero no estoy seguro de por qué no puedes simplemente escribir:
values_list = column(main_dt,G_VALUE_COL_STR)[rows];