Cómo dividir valores de varias palabras y reorganizarlos en orden alfabéticoTengo una columna con valores de caracteres que son abreviaturas de dos letras. Algunos son valores únicos y otros son valores múltiples separados por el delimitador "/". El problema es que los valores de valores múltiples no están en orden alfabético.
Quiero iterar a través de cada fila y dividir los valores múltiples y reorganizarlos en orden alfabético e insertar el nuevo "valor" en una Nueva columna. Los valores individuales deben ser simplemente "Copiados" y los valores nulos deben dejarse como valores nulos.
Esto está muy por encima de mi cabeza y agradeceré cualquier sugerencia o lista de lectura para ayudarme a solucionar este problema.
¡Gracias!
Datos actuales NUEVOS datos
AB AB
discos compactos
EF EF
CD/AB AB/CD
nulo nulo
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])),
),
);secuencias de comandosRe: Cómo dividir valores de varias palabras y reorganizarlos en orden alfabéticoEste ejemplo ilustra otro enfoque usando diccionarios:
Names Default To Here( 1 );
theList = {"AB", "AB", "CD", "EF"};
theArray = Associative Array( theList );
theNewList = theArray << Get Keys;
Show( theNewList );Re: Cómo dividir valores de varias palabras y reorganizarlos en orden alfabéticoNo, ninguna de las soluciones especificadas elimina los duplicados.Ese requisito no formaba parte de la solicitud original.
La función Contiene () tiene la capacidad de verificar elementos en una lista para ver si se encuentra una coincidencia.Lo uso bastante a menudo.
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);
Entonces, todo lo que se debe hacer es colocar este código en una u otra de las soluciones sugeridas.
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;Re: Cómo dividir valores de varias palabras y reorganizarlos en orden alfabéticoAdemás de la segmentación y la clasificación, ¿esta fórmula agrega y elimina los valores duplicados después de la segmentación y conserva solo los campos que no se repiten? Por ejemplo:

Atentamente.
Re: Cómo dividir valores de varias palabras y reorganizarlos en orden alfabéticoEstimado @txnelson y @Jeff_Perkinson Muchas gracias por sus respuestas; Una es una gran lección sobre bucles y la otra es una frase alucinante.
Agregaré ambos a mi bolsa de JSL.
Atentamente.
Re: Cómo dividir valores de varias palabras y reorganizarlos en orden alfabéticoMuy, muy agradableRe: Cómo dividir valores de varias palabras y reorganizarlos en orden alfabéticoNo es frecuente que pueda mejorar en @txnelson , pero puedo reducirlo a una fórmula de una línea:
Concat Items( Sort List( Words( :Current data, "/" ) ), "/" )
Palabras() crea una lista de palabras dividiendo la columna en palabras usando un "/" como delimitador.
Lista Ordenada() ordena la lista alfabéticamente
Artículos de concatenación() concatena los elementos de la lista en una sola cadena utilizando "/" para separar los elementos.

Re: Cómo dividir valores de varias palabras y reorganizarlos en orden alfabéticoAquí hay una fórmula que funciona en su tabla de datos de muestra.Se adjunta una tabla de datos con la fórmula aplicada
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]
);
)