dividere una colonna e creare più multipli basati su split utilizzando JSLCiao,
Devo leggere la tabella esistente e trovare la colonna di interesse [diciamo che il nome della colonna è "dati"].
la colonna "dati" è numerica con "punto" delimitato e ha la stessa lunghezza.
Il mio obiettivo è aprire questa tabella, leggere la colonna "data", rimuovere il "punto" e creare nuove colonne [secondo la lunghezza del valore] e ogni colonna contiene ogni valore.
Tabella originale:
dati
------
123.56.8.342
431.02.0.567
318.00.1.816
.....
risultato atteso:
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 for [ciclo interno per la creazione di colonne e altro ciclo per # di righe], sta creando più colonne [cioè larghezza dei dati letti * no, di righe] .
nel mio secondo tentativo [trail2.jmp], ottengo il numero corretto di colonne, ma i valori sono statici.
allegato è il mio jsl.
Apprezzo l'aiuto, bruciando l'olio di mezzanotte su questo 
Grazie,
Davide
Tabella datiRi: dividi una colonna e crea più multipli basati su split usando JSLCi sono vantaggi per entrambi i metodi. Il metodo della formula consentirà l'aggiunta di nuove righe e la modifica dei valori della data e le colonne c1....cn si adatteranno automaticamente. Il vantaggio del set each valore fornirà valori statici, che possono rivelarsi più efficienti perché le formule non devono essere eseguite più volte.Ri: dividi una colonna e crea più multipli basati su split usando JSLGrazie Jim.
hai una soluzione elegante.
in base al metodo proposto, ho notato che il nome della colonna non continua, [es. salta il Col # ogni volta che si incontra "punto"]; è necessario massaggiare i nomi delle piccole colonne [di cui mi sono preso cura].
Domanda:
Suggeriresti di fare in modo che la colonna abbia una formula e usi eval/substitute o farlo con "imposta ogni valore" come suggerito da Jamo dal punto di vista delle prestazioni?
Grazie,
Davide
Ri: dividi una colonna e crea più multipli basati su split usando JSLGrazie a Jamo per avermi fatto sapere cosa mi stavo perdendo. Sapevo di essere vicino 
dint conoscere la funzione incorporata "imposta ogni valore".
si, funziona tutto!
Grazie,
Davide
Ri: dividi una colonna e crea più multipli basati su split usando 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: dividi una colonna e crea più multipli basati su split usando JSLHo controllato solo la versione 2 di .jsl ed era abbastanza vicina.
Allego 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 usando i dati dalla 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, andrei 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 << Set Each Value 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 column
Modificare:
Buon post sull'uso di Eval Insert, Eval Expr, Parse e Substitute con le formule https://community.jmp.com/t5/JSL-Cookbook/Insert-one-expression-into-another-using-Eval-Insert-Eval-Expr/ta-p/48998