dividere una colonna e creare più multipli in base alla divisione utilizzando JSLCiao,
Ho bisogno di leggere la tabella esistente e trovare la colonna di interesse [ad esempio il nome della colonna è "dati"].
la colonna "dati" è numerica delimitata da "punto" e ha la stessa lunghezza.
Il mio obiettivo è aprire questa tabella, leggere i "dati" della colonna, rimuovere il "punto" e creare nuove colonne [in base alla lunghezza del valore] e ogni colonna contiene ogni valore.
Tabella orig:
dati
------
123.56.8.342
431.02.0.567
318.00.1.816
.....
output previsto:
dati 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
Nel mio primo tentativo [trial1.jmp], dove ho 2 cicli per [ciclo interno per la creazione di colonne e altri cicli per numero di righe], sta creando più colonne [cioè larghezza dei dati letti * no, di righe] .
nel mio secondo tentativo [trail2.jmp], ottengo il giusto numero di colonne, ma i valori sono statici.
allegato è il mio jsl.
Apprezzo l'aiuto, bruciando l'olio di mezzanotte su questo:(
Grazie,
David
Tabella datiRi: dividere una colonna e creare più multipli in base alla divisione utilizzando JSLHo controllato solo la versione 2 di .jsl ed era abbastanza vicina.
Ho allegato la versione modificata.
Ho modificato principalmente la parte del ciclo. C'è molto probabilmente un modo per gestire senza Eval (Parse ()) con le espressioni, ma questa volta sono andato con questa soluzione. Stavi utilizzando i dati della variabile clean_DATA che rimane la stessa per tutte le righe. Inoltre, se hai bisogno di formule, dovrai usare Eval (Parse ()) (o espressioni?) Per mantenere le formule funzionanti nel datatable. Se non sono necessarie formule, vorrei andare con << Imposta ogni valore invece di Formula.
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 << Imposta ogni valore il ciclo for sarebbe simile a questo:
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 columnRi: dividere una colonna e creare più multipli in base alla divisione utilizzando JSLEcco come esaudirei la tua richiesta.La funzione Substitute () consente alla formula di avere il valore effettivo della variabile "i" nella formula piuttosto che un riferimento alla variabile "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,
)
)
)
);Ri: dividere una colonna e creare più multipli in base alla divisione utilizzando JSLGrazie a Jamo per avermi fatto sapere cosa mi mancava. Sapevo di essere vicino;)
dint conoscere la funzione incorporata "imposta ogni valore".
sì, tutto funziona!
Grazie,
David
Ri: dividere una colonna e creare più multipli in base alla divisione utilizzando JSLGrazie Jim.
hai una soluzione elegante.
in base al metodo proposto, ho notato che il nome della colonna non è continua, [es. salta la Col # ogni volta che si incontra "punto"]; sono necessari piccoli nomi di colonna che massaggiano [cosa che ho curato].
Domanda:
Suggeriresti di avere una formula per la colonna e di usare eval / substitute o farlo con "set each value" come suggerito da Jamo dal punto di vista delle prestazioni?
Grazie,
David