dividir una columna y crear múltiples múltiples basados en la división usando JSLHola,
Necesito leer la tabla existente y encontrar la columna de interés [digamos que el nombre de la columna es "datos"].
la columna "datos" es numérica con un "punto" delimitado y tiene la misma longitud.
Mi objetivo es abrir esta tabla, leer la columna "datos", eliminar el "punto" y crear nuevas columnas [según la longitud del valor] y cada columna contiene cada valor.
Tabla orig:
datos
------
123.56.8.342
431.02.0.567
318.00.1.816
.....
Rendimiento esperado:
datos c1 c2 c3 c4 c5 c6 c7 c8 c9
-------------------------------------------------- ----------------------------
123.56.8.342 1 2 3 5 6 8 3 4 2
431.02.0.567 4 3 1 0 2 0 5 6 7
318.00.1.816 3 1 8 0 0 1 8 1 6
En mi primer intento [trial1.jmp], donde tengo 2 bucles for [bucle interno para crear columnas y otro bucle para el número de filas], está creando más columnas [es decir, ancho de los datos leídos * no, de filas] .
en mi segundo intento [trail2.jmp], obtengo el número correcto de columnas, pero los valores son estáticos.
adjunto es mi jsl.
Agradezco la ayuda, quemando el aceite de medianoche en este:(
Gracias,
David
Tabla de datosRe: dividir una columna y crear múltiples múltiples basados en dividir usando JSLSolo verifiqué la versión 2 de .jsl y estaba bastante cerca.
He adjuntado la versión modificada.
Modifiqué la parte del bucle principalmente. Es más probable que exista una forma de administrar sin Eval (Parse ()) con expresiones, pero esta vez elegí esta solución. Estabas usando datos de la variable clean_DATA que permanece igual para todas las filas. Además, si necesita tener fórmulas, tendrá que usar Eval (Parse ()) (¿o expresiones?) Para mantener las fórmulas funcionando en la tabla de datos. Si no se necesitan fórmulas, iría con << Establecer cada valor en lugar de Fórmula.
For(i = 1, i <= ncols_to_add, i++, // the || operator joins two strings
Eval(Parse("dt << New Column(\!"c\!" || Char(i),Numeric, Continous,
Formula(Num(Substr(Regex(:data, \!"\D\!", \!"\!", GLOBALREPLACE ), "||char(i)||", 1 )));
)));")); // put 1 bit in each column
);Con << Establecer cada valor, el bucle for se vería así:
For(i = 1, i <= ncols_to_add, i++, // the || operator joins two strings
dt << New Column("c" || Char(i),Numeric, Continous,
<< Set Each Value(Num(Substr(Regex(:data, "\D", "", GLOBALREPLACE ), i, 1 )));
)
); // put 1 bit in each columnRe: dividir una columna y crear múltiples múltiples basados en dividir usando JSLAsí es como cumpliría con su solicitud.La función Substitute () permite que la fórmula tenga el valor real de la variable "i" en la fórmula en lugar de una referencia a la variable "i"
Names Default To Here( 1 );
dt = Current Data Table();
col = Column( dt, "DATA" );
colLength = Length( col[1] );
For( i = 1, i <= colLength, i++,
If( Substr( col[1], i, 1 ) != ".",
Eval(
Substitute(
Expr(
dt << New Column( "c" || Char( i ), Numeric, Continous, Formula( Num( Substr( :data, __i__, 1 ) ) ) )
),
Expr( __i__ ), i,
)
)
)
);Re: dividir una columna y crear múltiples múltiples basados en dividir usando JSLGracias a Jamo por dejarme saber lo que me estaba perdiendo. Sabía que estaba cerca;)
No sé acerca de la función incorporada "establecer cada valor".
sí, ¡todo funciona!
Gracias,
David
Re: dividir una columna y crear múltiples múltiples basados en dividir usando JSLGracias Jim.
tienes una solución elegante.
según el método propuesto, noté que el nombre de la columna no continúa, [es decir. omite la columna # cuando se encuentra un "punto"]; Se necesita masajear los nombres de las columnas pequeñas [que me encargué].
Pregunta:
¿Sugeriría tener una columna con fórmula y usar eval / substitute o hacerlo con "establecer cada valor" como sugirió Jamo desde el punto de vista del desempeño?
Gracias,
David