JSL: Cómo copiar el último término de una fórmula y agregar este valor a la misma fórmulaHola a todos,
Estoy buscando un script que me permita seleccionar primero varias columnas de fórmula y en cada columna de fórmula toma el último término numérico y agrega este valor a la fórmula ya existente.
Con fines ilustrativos:
Una columna de fórmula antes de ejecutar el script:

y después (simplemente se copió y agregó el valor 39,78...):

Como tengo cientos de columnas de fórmulas diferentes, sería fantástico tener un script automatizado aquí.
¡Esperamos su ayuda!
¡Gracias!
/Marco
Modelado estadístico avanzadoAutomatización y secuencias de comandosAcceso a los datosIngeniería de Calidad y ProcesosRe: JSL: Cómo copiar el último término en una fórmula y agregar este valor a la misma fórmulaAquí hay dos formas de hacer esto, manipulando la fórmula como una cadena y luego como una expresión:
Names Default To Here( 1 );
//Make some sample data
dt =New Table( "Untitled",
Add Rows( 100 )
);
For Each( {i}, 1 :: 6,
Eval(
Eval Expr(
dt << New Column( "ToFix " || char(i),
Expression,
"None",
Formula( Vec Quadratic( [1 3 5, 3 2 6, 5 6 1], [1 3 5, 2 4 6] ) * Expr( i ) )
)
)
)
);
// Select some columns
dt << Select Columns( (dt << Get Column References)[4::5] );
//'fix' each selected column formula by manipulating the formula as a string
for each( {col, c}, dt << Get Column References( dt << Get Selected Columns ),
if( Starts With( col << get name(), "ToFix"),
newf = regex(
char(col << Get Formula),
"(.* \* (\d+))",
"\1 + \2"
);
//show(Parse(newf));
Eval( Eval Expr(
col << Set Formula( Expr( Parse(newf) ) )
) );
)
);
// Select some different columns
dt << Select Columns( (dt << Get Column References)[6::7] );
//'fix' each selected column formula by manipulating the formula as an expression
for each( {col, c}, dt << Get Column References( dt << Get Selected Columns ),
if( Starts With( col << get name(), "ToFix"),
f = col << Get Formula;
v = Arg(col << Get Formula, 2);
//show(Name Expr(f));
newf = Eval Expr( Add(Expr(Name Expr(f)), Expr(Name Expr(v))));
show(newf);
Eval( Eval Expr(
col << Set Formula( Expr( Name Expr(newf) ) )
) );
)
);
Re: JSL: Cómo copiar el último término en una fórmula y agregar este valor a la misma fórmulamuchas gracias por tu solucion @ih !
Tuve que adaptar ligeramente la expresión regular para satisfacer mis necesidades, ¡pero tu publicación definitivamente fue la clave para encontrarla!
Para cualquier otro usuario, encuentre a continuación el código adaptado:
// Select some columns
dt = currentdatatable();
dt << Get Selected Columns;
//'fix' each selected column formula by manipulating the formula as a string
for each( {col, c}, dt << Get Column References( dt << Get Selected Columns ),
newf = regex(
char(col << Get Formula),
"(.* \* (\d+\.?\d*))",
"\1 + \2"
);
//show(Parse(newf));
Eval( Eval Expr(
col << Set Formula( Expr( Parse(newf) ) )
) );
);Re: JSL: Cómo copiar el último término en una fórmula y agregar este valor a la misma fórmulaTambién puede usar Arg() según sus fórmulas. A continuación, si es un ejemplo muy simple:
Names Default To Here(1);
dt = New Table("Untitled 2",
Add Rows(2),
New Column("Column 1", Numeric, "Continuous", Format("Best", 12), Set Values([1, 2])),
New Column("Column 2", Numeric, "Continuous", Format("Best", 12), Formula(:Column 1 * 2)),
New Column("Column 3", Numeric, "Continuous", Format("Best", 12), Formula(:Column 2 * 3))
);
cur_col_idx = 3;
Show(column(dt, cur_col_idx) << get formula);
Eval(Substitute(
Expr(
Column(dt, cur_col_idx) << Set Formula(_old_f_ + _new_mult_)
),
Expr(_old_f_), Column(dt, cur_col_idx) << Get Formula,
Expr(_new_mult_),
old_f = Column(dt, cur_col_idx - 1) << Get Formula;
Arg Expr(old_f, N Arg(old_f))
));
Show(column(dt, cur_col_idx) << get formula);