JSL: come copiare l'ultimo termine in una formula e aggiungere questo valore alla stessa formulaCiao a tutti,
Sto cercando uno script che mi consenta di selezionare prima più colonne formula e in ciascuna colonna formula prende l'ultimo termine numerico e aggiunge questo valore alla formula già esistente.
A scopo illustrativo:
Una colonna formula prima di eseguire lo script:

e successivamente (è stato semplicemente copiato e aggiunto il valore 39,78...):

Dato che ho centinaia di colonne formula diverse, sarebbe fantastico avere uno script automatizzato qui.
In attesa del tuo aiuto!
Grazie!
/Marco
Modellazione statistica avanzataAutomazione e scriptingAccesso ai datiIngegneria della qualità e dei processiRe: JSL: come copiare l'ultimo termine in una formula e aggiungere questo valore alla stessa formulaEcco due modi per farlo, manipolando la formula come stringa e poi come espressione:
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: come copiare l'ultimo termine in una formula e aggiungere questo valore alla stessa formulaGrazie mille per la tua soluzione @ih !
Ho dovuto adattare leggermente l'espressione regolare per soddisfare le mie esigenze, ma il tuo post è stato sicuramente la chiave per trovarlo!
Per qualsiasi altro utente, trovi di seguito il codice adattato:
// 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: come copiare l'ultimo termine in una formula e aggiungere questo valore alla stessa formulaPotresti anche essere in grado di utilizzare Arg() a seconda delle tue formule. Di seguito un esempio molto semplice:
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);