script jsl pour recoder plusieurs colonnesChers tous,
J'essaie de recoder plusieurs colonnes en utilisant le script suivant (également en pièce jointe avec un exemple de table de données). J'ai essayé plusieurs modifications mais cela ne fonctionne pas. Les valeurs dans les colonnes disparaissent simplement au lieu d'être recodées.
J'apprécie toute aide.
Merci beaucoup,
Marcello.
dt3 = Current Data Table();
n3 = dt3 << Get Column Names();
Show( n3 );
lstColNames_n3 = dt3 << Get Column Names();
Show( lstColNames_n3 );
Show( lstCols_n3 );
lstCols_n3 = {};
For( i = 1, i <= N Items( lstColNames_n3 ), i++,
colName = lstColNames_n3[i];
col = Column( dt3, i );
Insert Into( lstCols_n3, col );
);
Show( lstCols_n3 );
For Each Row(
For( i = 1, i <= N Items( lstColNames_n3 ), i++,
As Column( lstColNames_n3[i] ) = Match( As Column( lstColNames_n3[i] ),
"1", "too low",
"2", "too low",
"3", "right",
"4", "too high",
"5", "too high"
)
)
);
ScriptRe : script jsl pour recoder plusieurs colonnesMerci!
Re : script jsl pour recoder plusieurs colonnesUne solution de contournement consisterait à créer une nouvelle colonne avec une formule basée sur la colonne que vous souhaitez recoder.
Supprimez ensuite la colonne d'origine
Re : script jsl pour recoder plusieurs colonnesMerci beaucoup!
Re : script jsl pour recoder plusieurs colonnesVoici la solution utilisant la fonctionnalité Recode écrite en JSL C'est beaucoup plus rapide que de faire un traitement ligne par ligne
Names Default To Here( 1 );
dmdt = current data table();
nc = dmdt << get column names( Character );
For( i = 1, i <= N Items( nc ), i++,
col = Column( dt, nc[i] );
colname = col << getname();
Eval(
Parse(
Eval Insert(
"\[
dmdt << Recode Column(
:Name("^colname^"),
{Map Value( _rcOrig,
{ "1", "too low",
"2", "too low",
"3", "right",
"4", "too high",
"5", "too high"},
Unmatched( _rcNow ) )},
Update Properties( 1 ),
Target Column( :Name("^colname^") )
);
]\"
)
)
);
);
Re : script jsl pour recoder plusieurs colonnesMerci beaucoup, votre code avec le tableau associatif a parfaitement fonctionné.
J'ai aussi essayé l'autre option, en ajoutant
Match(As Column( lstColNames_n3[i])[Row()],
Mais ça n'a pas marché.
Mais j'ai résolu mon problème.
Merci beaucoup.
Re : script jsl pour recoder plusieurs colonnesJ'ai édité ma réponse précédente, ça devrait aider avec le recodageRe : script jsl pour recoder plusieurs colonnesJ'aurais besoin de recoder les valeurs. Merci.
Re : script jsl pour recoder plusieurs colonnesDevez-vous recoder les valeurs ou pourriez-vous éventuellement utiliser les étiquettes de valeur de propriété de colonne (de cette façon, vous ne perdrez pas les données d'origine), exemple : Recoder plusieurs colonnes avec le script JSL
Éditer:
Et si vous devez les recoder en place, il existe plusieurs façons de le faire (j'utiliserais Associative Array):
Names Default To Here(1);
dt3 = current data Table ();
n3 = dt3 << Get Column Names(string);
show(n3);
//create associative array to use matching keys to values
matchAa = Associative Array(
{"1","2","3","4","5"},
{"too low","too low","right","too high","too high"}
);
show(matchAa);
//loop over column names
For(i = 1, i <= N Items(n3), i++,
//refer to column and use set each value to update values
Column(dt3, n3[i]) << Set Each Value(
matchAa[AsColumn(n3[i])[Row()]]
);
);
Et pour votre solution, je pense qu'il y a un problème dans la façon dont vous vous référez aux valeurs dans la fonction Match et vous devez ajouter [Row ()] pour obtenir des valeurs uniques pour Matching
Match(As Column( lstColNames_n3[i])[Row()],
Edit2 :
Ajout d'un exemple de script complet en pièce jointe