diviser une colonne et créer plusieurs multiples en fonction de la division à l'aide de JSLBonjour,
J'ai besoin de lire la table existante et de trouver la colonne d'intérêt [disons que le nom de la colonne est "data"].
la colonne «données» est numérique avec un «point» délimité et a la même longueur.
Mon objectif est d'ouvrir ce tableau, lire la colonne "données", supprimer le "point" et créer de nouvelles colonnes [selon la longueur de la valeur] et chaque colonne contient chaque valeur.
Tableau Orig:
Les données
------
123.56.8.342
431.02.0.567
318.00.1.816
.....
production attendue:
données 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
Dans ma première tentative [trial1.jmp], où j'ai 2 boucles for [boucle interne pour créer des cols, et une autre boucle pour # de lignes], il crée plus de colonnes [c'est-à-dire largeur des données lues * non, de lignes] .
dans ma deuxième tentative [trail2.jmp], j'obtiens le bon # de cols, mais les valeurs sont statiques.
ci-joint est mon jsl.
J'apprécie l'aide, brûlant l'huile de minuit là-dessus:(
Merci,
David
Tableau de donnéesRe: diviser une colonne et créer plusieurs multiples en fonction de la division à l'aide de JSLJe n'ai vérifié que la version 2 de .jsl et c'était assez proche.
J'ai joint la version modifiée.
J'ai principalement modifié la partie boucle. Il y a probablement un moyen de gérer sans Eval (Parse ()) avec des expressions mais j'ai opté pour cette solution cette fois. Vous utilisiez les données de la variable clean_DATA qui restent les mêmes pour toutes les lignes. De plus, si vous avez besoin de formules, vous devrez utiliser Eval (Parse ()) (ou expressions?) Pour que les formules fonctionnent dans la table de données. Si aucune formule n'est nécessaire, j'irais avec << Définir chaque valeur au lieu de Formule.
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
);Avec << Set Each Value, la boucle for ressemblerait à ceci:
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 columnRe: diviser une colonne et créer plusieurs multiples en fonction de la division à l'aide de JSLVoici comment j'accomplirais votre demande.La fonction Substitute () permet à la formule d'avoir la valeur réelle de la variable «i» dans la formule plutôt qu'une référence à 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: diviser une colonne et créer plusieurs multiples en fonction de la division à l'aide de JSLMerci Jamo de m'avoir fait savoir ce qui me manquait. Je savais que j'étais proche;)
à force de savoir sur la fonction intégrée "définir chaque valeur".
ouais, tout fonctionne!
Merci,
David
Re: diviser une colonne et créer plusieurs multiples en fonction de la division à l'aide de JSLMerci Jim.
vous avez une solution élégante.
basé sur votre méthode proposée, j'ai remarqué que le nom de la colonne ne se poursuit pas, [c.-à-d. saute le Col # chaque fois qu'un "point" est rencontré]; il faut un petit massage des noms de colonnes [dont j'ai pris soin].
Question:
Souhaitez-vous suggérer que la colonne ait une formule et utiliser eval / substitute ou le faire avec "définir chaque valeur" comme Jamo l'a suggéré du point de vue des performances?
Merci,
David