Come dividere i valori di più parole e riorganizzarli in ordine alfabeticoHo una colonna con i valori dei caratteri che sono abbreviazioni di due lettere. Alcuni sono valori singoli e altri sono valori multipli separati dal delimitatore "/". Il problema è che i valori multivalore non sono in ordine alfabetico.
Voglio scorrere ogni riga e dividere i multi-valori e riorganizzarli in ordine alfabetico e inserire il nuovo "valore" in una nuova colonna. I valori singoli dovrebbero essere solo "Copiati" e i null lasciati come null.
Questo è molto al di sopra della mia testa e apprezzerò qualsiasi suggerimento o elenco di letture per aiutarmi a risolvere questo problema.
Grazie!
Dati attuali NUOVI dati
AB AB
CDCD
EF EF
CD/AB AB/CD
nullo nullo
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])),
),
);ScriptingRi: Come dividere i valori di più parole e riorganizzarli in ordine alfabeticoQuesto esempio illustra un altro approccio utilizzando i dizionari:
Names Default To Here( 1 );
theList = {"AB", "AB", "CD", "EF"};
theArray = Associative Array( theList );
theNewList = theArray << Get Keys;
Show( theNewList );Ri: Come dividere i valori di più parole e riorganizzarli in ordine alfabeticoNo, nessuna delle soluzioni specificate rimuove i duplicati.Tale requisito non faceva parte della richiesta originaria.
La funzione Contains() ha la capacità di controllare gli elementi in un elenco per vedere se viene trovata una corrispondenza.Lo uso abbastanza spesso.
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);
Quindi tutto ciò che deve essere fatto è inserire questo codice in una o nell'altra soluzione suggerita.
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;Ri: Come dividere i valori di più parole e riorganizzarli in ordine alfabeticoOltre alla segmentazione e all'ordinamento, questa formula aggiunge e rimuove i valori duplicati dopo la segmentazione e mantiene solo i campi che non si ripetono? Ad esempio:

Distinti saluti.
Ri: Come dividere i valori di più parole e riorganizzarli in ordine alfabeticoCaro @txnelson E @Jeff_Perkinson Grazie mille per le tue risposte; 0ne una grande lezione sui loop e l'altra una sbalorditiva battuta.
Aggiungerò entrambi alla mia borsa di JSL.
Distinti saluti.
Ri: Come dividere i valori di più parole e riorganizzarli in ordine alfabeticoMolto molto carinoRi: Come dividere i valori di più parole e riorganizzarli in ordine alfabeticoNon capita spesso che io possa migliorare @txnelson , ma posso ridurlo a una formula di una riga:
Concat Items( Sort List( Words( :Current data, "/" ) ), "/" )
Parole() crea un elenco di parole suddividendo la colonna in parole utilizzando un "/" come delimitatore.
Ordina elenco() ordina l'elenco in ordine alfabetico
Elementi concatenati() concatena gli elementi nell'elenco in una singola stringa utilizzando "/" per separare gli elementi.

Ri: Come dividere i valori di più parole e riorganizzarli in ordine alfabeticoEcco una formula che funziona sulla tua tabella di dati di esempio.In allegato una tabella dati con la formula applicata
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]
);
)