Unir tablas a través de secuencias de comandos usando ExpressionHola,
Estoy trabajando en un complemento para concatenar horizontalmente los valores provenientes del conector OSIsoft-PI, ya que abre cada etiqueta en tablas separadas para las cuales la columna (1) es la marca de tiempo y la columna (2) es el valor de la etiqueta.Encontré una solución usando "Actualizar" cual funciona bien . Sin embargo, mi plan inicial era usar "Unirse" para evitar la recopilación de filas cuando las marcas de tiempo están desalineadas y evitar el último paso de eliminar filas como con la estrategia "Actualizar".Desafortunadamente, enfrenté varios mensajes de error y me gustaría entender mejor cómo hacer que Join funcione (para más trabajos de secuencias de comandos). Encuentre adjunto un documento de Word con más detalles sobre pasos y errores, así como secuencias de comandos (Actualizar funciona, mientras que Unir falla) y tablas de datos.
Gracias por la ayuda, estoy abierto para una reunión de equipo o documentación.
emmanuel
Re: Unir tablas a través de secuencias de comandos usando ExpressionBuen día, @Emmanuel_Romeu ,
No veo la palabra documento que mencionaste.
Re: Unir tablas a través de secuencias de comandos usando Expressionrecién añadido, lo sientoRe: Unir tablas a través de secuencias de comandos usando ExpressionHola, Emmanuel. Podrías probar esto, que recorre el proceso de combinación y solo tiene un manejo de expresión mínimo.
Names Default To Here( 1 );
// List of opened files
file = Get Data Table List();
n_files = N Items( file );
joinCol = "Timestamp";
joinedDt = file[1];
For Each( {i}, 2 :: (n_files), // i =2;
Eval(
Eval Expr(
joinedDt = joinedDt << Join(
With( file[i] ),
By Matching Columns( Expr( Parse( Eval Insert( ":^joinCol^" ) ) ) = Expr( Parse( Eval Insert( ":^joinCol^" ) ) ) ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 ),
invisible
)
)
);
//set first column to join column name
Column( joinedDt, 1 ) << set name( joinCol );
//delete working files and prepare for next time through loop
Close( file[i], nosave );
Try( Close( oldJoin, nosave ) );
oldJoin = joinedDt;
);
Close( file[1], nosave );
//remove extra join columns
For Each( {i}, N Col( joinedDt ) :: 2,
If( Lowercase( Left( Column( joinedDt, i ) << get name, 9 ) ) == Lowercase( joincol ),
joinedDt << delete columns( i )
)
);
joinedDt << show window( 1 );
Re: Unir tablas a través de secuencias de comandos usando ExpressionGracias Brady, funciona .
Ahora me voy a la cama y mañana (o el lunes) intentaré comprender exactamente cómo funciona
.
Gracias.
Re: Unir tablas a través de secuencias de comandos usando ExpressionHágame saber si tiene alguna pregunta después de revisarlo, estaré encantado de elaborar / tener una llamada.
Salud,
Brady
Re: Unir tablas a través de secuencias de comandos usando ExpressionArreglar Script_Concatenar_Etiquetas_w_JOIN_Fail_2 :
Cambie la Línea 70 a: Expr (dt_joined = dt_joined << Unir(
Eliminar línea 80: Expr (dt_joined), tabla de datos actual() ,
En mi opinión, Tabla de datos actual () solo debe usarse para obtener la tabla actual al comienzo del script porque es una de las pocas veces que sabrá con certeza a qué tabla hace referencia (la última que tocó el usuario). En muchas otras circunstancias, la tabla actual puede diferir de una ejecución a otra según las operaciones que se estén realizando, el tiempo que tarden, si el usuario ha tocado otra tabla mientras se procesan las cosas, si los cambios en el código subyacente han causado lo que era la tabla actual. tabla en una versión para cambiar en la siguiente, etc. La forma en que usaste Tabla de datos actual () es por eso que su secuencia de comandos "funcionó" (se unió a la segunda tabla del archivo con la tabla que seleccionó). Creo firmemente que las tablas solo deben referenciarse explícitamente. Esto es lo que se hace en la nueva línea 70, donde sabe con certeza que es tanto la tabla a la que se envía el mensaje como la variable a la que se pasa la tabla resultante.
Obtener nombres de columna en plataformas usando expresiones es complicado, particularmente cuando el argumento puede tomar varias columnas. Casi siempre necesito probar algunas cosas diferentes antes de encontrar algo que funcione. Estoy bastante seguro de que esta funcionalidad ha evolucionado a lo largo de los años, cambiando afortunadamente para mejor (más flexible). Aún así, es un desafío. @Mark_Bailey posee un buen artículo sobre cómo trabajar con la columna que recomiendo leer.
En el Script_Concatenar_Etiquetas_w_JOIN_Fail_1 guión, el primero Unirse bloque, el problema no es con Analizar gramaticalmente , pero al intentar insertar una referencia a la columna en una lista (JMP no puede encontrar la columna). Si bien puede tener varias declaraciones en Sustituto (Hago esto con frecuencia), no es necesario en este caso. Puedes ponerlo directamente en Unirse usando su nombre en lugar de su número (que no pude ponerme a trabajar). Además de eso, puede tomar todas las columnas de la tabla unida y todas menos la primera de la tabla para unirlas. He reorganizado el código para poder hacer referencia explícita a las tablas y columnas y eliminar la tabla que no necesito de inmediato.
name = Get Data Table List(); <BR />For(i=1,i<=N Items(name),i++, name[i] = Head Name(name[i]));<BR /><BR />join1 = Data Table(1);
for (f=2, f<= N Items(name),f++,
colList1 = join1 << Get Column Names();
colList2 = Remove(Data Table(name[f]) << Get Column Names(),1);
Eval(
Substitute(
Expr (
dt_joined = join1 << Join(
With( join2 ),
Select(cl1),
SelectWith( cl2 ),
By Matching Columns( join1Col1 = join2Col1),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 )
)
) ,
Expr (join2), Data Table(name[f]),
Expr(cl1), Name Expr(colList1),
Expr(cl2), Name Expr(colList2),
Expr (join1Col1), Column(join1,1),
Expr (join2Col1), Column(Data Table(name[f]),1),
)
);
Close(join1,No Save);
Close(Data Table(name[f]),No Save);
join1 = dt_joined;
);
He arreglado las cosas en la parte superior del código, no necesita crear una tabla para recopilar los nombres de las tablas. Es mucho más sencillo poner los nombres en una lista y trabajar a partir de ahí. Esto puede ser un poco difícil de manejar si las mesas son grandes. Mejor para usar Invisible o Privado para ocultar las tablas intermedias. El problema es que, hasta donde yo sé, no hay forma de mostrar la tabla final usando mensajes. Podría hacer un subconjunto usando toda la tabla para volver a mostrarlo.
Re: Unir tablas a través de secuencias de comandos usando ExpressionHola Don, gracias!!
*por Script_Concatenate_Tags_w_JOIN_Fail_2, como dijiste que usé tabla de datos actual () para que funcione, pero sospechaba que no es la mejor manera de hacerlo. Ahora entiendo que la solución estaba muy cerca con dt_joined = dt_joined << Join() pero nunca lo hubiera pensado solo (ahora entiendo "el la tabla que se envía el mensaje y la variable a la que se pasa la tabla resultante" espero pensar en ello en el futuro).
*para Script_Concatenate_Tags_w_JOIN_Fail_1, de hecho, es mucho más simple cuando se usa el comando correcto (por ejemplo, name[i] = Head Name(name[i] o colList2 = Remove(Data Table(name[f]) << Get Column Names(),1 )
en lugar de construir cosas complejas para lograrlo (es bueno saberlo).
Gracias de nuevo.