dividir una columna y crear múltiples múltiples basados en 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 original:
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 # 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 esto 
Gracias,
David
Tabla de datosRe: dividir una columna y crear múltiples múltiples basados en división usando JSLHay ventajas en ambos métodos. El método de fórmula permitirá la adición de nuevas filas y el cambio de los valores de Fecha, y las columnas c1....cn se ajustarán automáticamente. La ventaja de establecer cada valor proporcionará valores estáticos, que pueden resultar más eficientes porque las fórmulas no tienen que ejecutarse varias veces.Re: dividir una columna y crear múltiples múltiples basados en la división usando JSLgracias jim
tienes una solución elegante.
basado en su método propuesto, noté que el nombre de la columna no continúa, [es decir. salta el # de columna cuando se encuentra un "punto"]; Se necesita masajear los nombres de las columnas pequeñas [que me encargué].
Pregunta:
¿Sugeriría que la columna tenga una fórmula y use eval/substitute o hacerlo con "establecer cada valor" como sugirió Jamo desde el punto de vista del rendimiento?
Gracias,
David
Re: dividir una columna y crear múltiples múltiples basados en división usando JSLGracias Jamo por hacerme saber lo que me estaba perdiendo. Sabía que estaba cerca 
No sé acerca de la función integrada "establecer cada valor".
¡sí, todo funciona!
Gracias,
David
Re: dividir una columna y crear múltiples múltiples basados en la división usando JSLAsí es como cumpliría con su pedido.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 división usando JSLSolo revisé la versión 2 de .jsl y estaba bastante cerca.
Adjunto versión modificada.
Modifiqué la parte del bucle principalmente. Lo más probable es que haya una forma de administrar sin Eval (Parse ()) con expresiones, pero esta vez opté por esta solución. Estaba 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 que las fórmulas sigan 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 column
Editar:
Buena publicación sobre el uso de Eval Insert, Eval Expr, Parse y Substitute con fórmulas https://community.jmp.com/t5/JSL-Cookbook/Insert-one-expression-into-another-using-Eval-Insert-Eval-Expr/ta-p/48998