Besoin d'aide avec les expressions, les références de colonne, les formules et le changement de nom de colonneTous,
Besoin d'aide dans le cas suivant.
J'ai un nom de colonne dans un format de chaîne.
Je dois créer une nouvelle colonne avec une formule basée sur l'ancienne. je fais comme ça :
oldCol = "OldColumn";
Eval( Eval Expr( dt << New Column( "NewColumn", formula( As Column( Expr( oldCol ) ) ) ) ) );
Ensuite, plus tard dans le script, je dois renommer l'ancienne colonne. je le fais comme ça:
Column(oldCol) << Set Name("NewOldColumn");Le problème maintenant est que puisque j'ai la formule de la nouvelle colonne sous la forme de :
As Column("OldColumn")il ne se met pas à jour lorsque OldColumn change de nom.
J'aimerais l'avoir sous forme de
:OldColumn
mais je ne sais pas comment faire ça.
Donc, la question est: Comment dois-je modifier l'expression:
Eval( Eval Expr( dt << New Column( "NewColumn", formula( As Column( Expr( oldCol ) ) ) ) ) );
de sorte qu'il produit une formule sous la forme de :AncienneColonne , et non sous la forme de Comme colonne("OldColumn") ?
Voici le script complet avec lequel jouer :
dt = New Table( "TestColumnsReferences",
Add Rows( 3 ),
New Column( "OldColumn", Character, "Nominal", Set Values( {"a", "b", "c"} ) )
);
oldCol = (dt << Get Column Names(string))[1];
//oldCol = "OldColumn";
Eval( Eval Expr( dt << New Column( "NewColumn", formula( As Column( Expr( oldCol ) ) ) ) ) );
Column(oldCol) << Set Name("NewOldColumn");Merci, M
Études de consommation et de marchéRe : Besoin d'aide pour les expressions, les références de colonne, les formules et le changement de nom de colonneMerci pour l'astuce sur JSL Quote()! C'est vraiment beaucoup plus propre maintenant que je n'ai plus à échapper à toutes les citations.
Re : Besoin d'aide pour les expressions, les références de colonne, les formules et le changement de nom de colonneLe problème avec "Comme colonne" comme je l'ai expliqué dans la question est qu'il reste dans la formule, puis lorsque je change plus tard le nom de la colonne à laquelle je fais référence dans la colonne (et que je le change), la formule devient invalide
Mes excuses, avec votre combinaison Expr --> Nom Expr --> En tant que colonne, cela fonctionne ! Il transforme As Column("string") en :string !
On m'a donné plusieurs solutions ici, et j'ai vraiment aimé celle avec JSL Quote, mais c'est ma nouvelle préférée. Va falloir refaire le script encore une fois 
Re : Besoin d'aide pour les expressions, les références de colonne, les formules et le changement de nom de colonneUne autre option est la combinaison de Eval(), EvalExpr(), Expr(), Name Expr() et As Column()
Names Default To Here(1);
dt = New Table("TestColumnsReferences", Add Rows(3),
New Column("OldColumn", Character, "Nominal", Set Values({"a", "b", "c"}))
);
oldCol = (dt << Get Column Names(string))[1];
//oldCol = "OldColumn";
Eval(Eval Expr(dt << New Column("NewColumn", formula(Expr(Name Expr(AsColumn(oldCol)))))));
Column(oldCol) << Set Name("NewOldColumn");Re : Besoin d'aide pour les expressions, les références de colonne, les formules et le changement de nom de colonnePersonnellement, j'aime utiliser le Devis JSL() fonction pour maintenir la coloration syntaxique et l'analyse lexicale - puis passez simplement la valeur dans le :Nom() directive, en tant que telle
dt = New Table( "TestColumnsReferences",
Add Rows( 3 ),
New Column( "OldColumn", Character, "Nominal", Set Values( {"a", "b", "c"} ) )
);
oldCol = (dt << Get Column Names(string))[1];
//oldCol = "OldColumn";
Eval( Parse( Eval Insert( JSL Quote(
dt << New Column( "NewColumn", Formula( :Name("^oldCol^") ) )
) ) ) );
Column(oldCol) << Set Name("NewOldColumn");Re : Besoin d'aide pour les expressions, les références de colonne, les formules et le changement de nom de colonneOui, essentiellement la même approche que celle que j'ai montrée ci-dessous, utilisez uniquement Remplaçant au lieu de Insertion d'évaluation , droite?
Re : Besoin d'aide pour les expressions, les références de colonne, les formules et le changement de nom de colonneOk, j'ai compris. Pour la partie formule, utilisez simplement la chaîne suivante :
Name Expr(Expr(Parse(Eval Insert(":#oldCol#", startChar="#"))))J'ai dû utiliser startChar="#" car dans la vraie formule de script utilise en fait REgEx où "^" est utilisé.
Donc le script complet est celui-ci :
dt = New Table( "TestColumnsReferences",
Add Rows( 3 ),
New Column( "OldColumn", Character, "Nominal", Set Values( {"a", "b", "c"} ) )
);
oldCol = (dt << Get Column Names(string))[1];
//oldCol = "OldColumn";
Eval( Eval Expr( dt << New Column( "NewColumn", formula( Name Expr(Expr(Parse(Eval Insert(":#oldCol#", startChar="#")))) ) ) ) );
Column(oldCol) << Set Name("NewOldColumn");De cette façon, la formule a :AncienneColonne plutôt que Comme colonne("OldColumn") et vous pouvez désormais renommer les colonnes en toute sécurité sans casser la formule.
Re : Besoin d'aide pour les expressions, les références de colonne, les formules et le changement de nom de colonneVoici une approche qui fonctionne pour moi.J'ai étendu la dénomination pour gérer les noms de colonnes JMP complexes.Cela confond un peu le lecteur, mais rend la méthode plus puissante
dt = New Table( "TestColumnsReferences",
Add Rows( 3 ),
New Column( "OldColumn+one", Character, "Nominal", Set Values( {"a", "b", "c"} ) )
);
oldCol = (dt << Get Column Names( string ))[1];
//oldCol = "OldColumn";
//Eval( Eval Expr( dt << New Column( "NewColumn", formula( As Column( Expr( oldCol ) ) ) ) ) );
Eval(
Substitute(
Expr(
dt << New Column( "NewColumn", formula( __oldCol__ ) )
),
Expr( __oldCol__ ), parse(":\!"" || oldCol || "\!"n")
)
);
Column( oldCol ) << Set Name( "NewOldColumn" );
Re : Besoin d'aide pour les expressions, les références de colonne, les formules et le changement de nom de colonneJe vois une façon de faire cela (mais plutôt de ne pas le faire de cette façon).
Obtenez les noms de colonnes non pas sous forme de chaînes, mais sous forme de références, puis utilisez simplement Nom Expr() :
oldCol = (dt << Get Column Names())[1];<BR />Eval( Eval Expr( dt << New Column( "NewColumn", formula( Name Expr( oldCol ) ) ) ) );
mais j'ai déjà le nom de la colonne sous forme de chaîne et je voudrais m'y tenir.