Comment diviser des valeurs de plusieurs mots et les réorganiser par ordre alphabétiqueJ'ai une colonne avec des valeurs de caractères qui sont des abréviations de deux lettres. Certaines sont des valeurs uniques et d'autres sont des valeurs multiples séparées par le délimiteur «/». Le problème est que les valeurs à valeurs multiples ne sont pas classées par ordre alphabétique.
Je veux parcourir chaque ligne et diviser les multi-valeurs et les réorganiser par ordre alphabétique et insérer la nouvelle «valeur» dans une nouvelle colonne. Les valeurs uniques doivent être simplement "Copiées" et les valeurs nulles laissées sous forme de valeurs nulles.
C'est bien au-dessus de ma tête et j'apprécierai tous les pointeurs de suggestions ou listes de lecture pour m'aider à résoudre celui-ci.
Merci!
Données actuelles NOUVELLES données
AB AB
CD CD
EF EF
CD / AB AB / CD
null Null
EF / AB / CD AB / CD / EF
col = ("Really | Long | and | Boring | Column | Name");
Vals = As Column (col) << Get Values; // Get Values
dt = New Column ("NewAbs", Character, "Nominal" ); //New column for NEW DATA
rows = N rows (dt); // Total number of rows to iterate
for(i = 1 , i <= rows, i++,
if(rowVal (Contains (Vals[i], "/")), // check if is multi-value i.e. AB/DF
rowVal = Words(Vals[i],"/"); // Words will split multi-values at "/"
sval = Sort List(Eval List(rowVal) ); // sort the character values
For(i = 1, i <= N Items (sVal), i++,
newVal = sVal[i];
conCat = Concat Items ( newVal[i] || "/"|| newVal[i+i])
),
Insert Into (dt, conCat[i]),
if(rowVal (!Contains (Vals[i], "/")), // if is NOT multi-value i.e. AB/DF
Insert Into (dt, rowVal[i])),
),
);ScriptingRe: Comment diviser des valeurs de plusieurs mots et les réorganiser par ordre alphabétiqueVoici une formule qui fonctionne sur votre exemple de table de données.Ci-joint un tableau de données avec la formule appliquée
If( Contains( :Current data, "/" ) == 0,
x = :Current data,
i = 1;
theList = {};
While( Word( i, :Current data, "/" ) != "",
Insert Into( theList, Word( i, :Current data, "/" ) );
i++;
);
theList = Sort List( theList );
x = theList[1];
For( i = 2, i <= N Items( theList ), i++,
x = x || "/" || theList[i]
);
)Re: Comment diviser des valeurs de plusieurs mots et les réorganiser par ordre alphabétiqueCe n'est pas souvent que je peux m'améliorer @txnelson , mais je peux le réduire à une formule sur une ligne:
Concat Items( Sort List( Words( :Current data, "/" ) ), "/" )
Mots() crée une liste de mots en divisant la colonne en mots en utilisant un "/" comme délimiteur.
Trier la liste () trie la liste par ordre alphabétique
Objets Concat () concatène les éléments de la liste en une seule chaîne en utilisant le "/" pour séparer les éléments.

Re: Comment diviser des valeurs de plusieurs mots et les réorganiser par ordre alphabétiqueTrès très gentilRe: Comment diviser des valeurs de plusieurs mots et les réorganiser par ordre alphabétiquecher @txnelson et @Jeff_Perkinson Merci beaucoup pour vos réponses; 0ne une excellente leçon sur les boucles et l'autre un one-liner époustouflant.
J'ajouterai les deux à mon sac de JSL.
Meilleures salutations.
Re: Comment diviser des valeurs de plusieurs mots et les réorganiser par ordre alphabétiqueOutre la segmentation et le tri, cette formule ajoute-t-elle et supprime-t-elle les valeurs dupliquées après la segmentation et ne conserve-t-elle que les champs qui ne se répètent pas? Tels que:

Meilleures salutations.
Re: Comment diviser des valeurs de plusieurs mots et les réorganiser par ordre alphabétiqueNon, aucune des solutions spécifiées ne supprime les doublons.Cette exigence ne faisait pas partie de la demande initiale.
La fonction Contains () a la capacité de vérifier les éléments d'une liste pour voir si une correspondance est trouvée.Je l'utilise assez souvent.
Names Default To Here( 1 );
theList = {"AB", "AB", "CD", "EF"};
x = {};
Insert Into( x, theList[1] );
For( i = 2, i <= N Items( theList ), i++,
If( Contains( x, theList[i] ) == 0,
Insert Into( x, theList[i] )
)
);
show(x);
Il ne reste donc plus qu'à placer ce code dans l'une ou l'autre des solutions proposées.
x = :Current data;
If( Contains( x, "/" ) > 0,
theList = Words( x, "/" );
theList = Sort List( theList );
x = {};
Insert Into( x, theList[1] );
For( i = 2, i <= N Items( theList ), i++,
If( Contains( x, theList[i] ) == 0,
Insert Into( x, theList[i] )
)
);
x = Concat Items( x, "/" );
);
x;