Conversione di un intervallo di caratteri alfanumerici in un elenco (da X1-3 a X1, X2, X3)Ciao,
Sto provando a convertire un intervallo di caratteri alfanumerici in un elenco. Sono abbastanza nuovo di JSL e non sono sicuro di come fare esattamente. Questo è quello che vorrei ottenere:
Originale: CH1-3
Ritorno: CH1, CH2, CH3
Il prefisso del carattere non contiene sempre due caratteri (potrebbe essere CH1-3 o X5-8 per esempio).
So che se avessi un intervallo di soli due numeri, come CH1-2, potrei usare il seguente script per ottenere quello che voglio:
Regex("CH1-2", "([A-Z]+)([0-9]+)(-)([0-9]+)", "\1\2,\1\4", GLOBALREPLACE);Che restituisce CH1, CH2
Tuttavia, non ho idea di come farlo per intervalli con più di due numeri.
Qualsiasi assistenza sarebbe molto apprezzata!
Ri: Conversione di un intervallo di caratteri alfanumerici in un elenco (da X1-3 a X1, X2, X3)Questo script illustra un modo per farlo:
Names Default to Here( 1 );
dt = New Table( "Col Range Test Cases",
New Column( "A",
"Character",
"Nominal",
Values( { "CH1-2,CH17,CH6-8", "T7", "MR101-103", "P4-5", "U2", "AR6-7" } )
),
New Column( "B",
"Character",
"Nominal"
)
);
For Each Row(
// tokenize current string with comma delimiter
// Row() = 1;
range = Words( Column( dt, 1 )[], "," );
For( i = 1, i <= N Items( range ), i++,
// look for col range
result = Regex Match(
range[i],
"^(\w+?)(\d+)-(\d+)\b"
);
If( N Items( result ) == 0,
// regex failed, not a col range
If( i == 1,
// start string result
answer = range[i],
// add to string result
answer = Concat( answer, ", ", range[i] );
),
// regex succeeded, a col range
letters = result[2];
first = Num( result[3] );
last = Num( result[4] );
// append columns in the range
For( n = first, n <= last, n++,
col = Char( letters ) || Char( n );
If( i == 1 & n == first,
answer = col,
answer = Concat( answer, ", ", col );
);
);
);
);
// Row() = 1;
Column( dt, 2 )[] = answer;
);Ri: Conversione di un intervallo di caratteri alfanumerici in un elenco (da X1-3 a X1, X2, X3)Grazie per la risposta! È molto utile
Ho cercato di inciderlo con quello che sto cercando di fare, ma ho delle difficoltà. Forse potresti prestarmi nuovamente la tua assistenza?
Ho a che fare con una tabella di dati come quella qui sotto, dove ho più colonne piene di dati. Sto provando a sostituire i valori a distanza ovunque si presentino
originale:
| UN | B | C |
| CH1-2, CH17, CH6-8 | MR101-103 | U2 |
| T7 | P4-5 | AR6-7 |
desiderata:
| UN | B | C |
| CH1, CH2, CH17, CH6, CH7, CH8 | MR101, MR102, MR103 | U2 |
| T7 | P4, P5 | AR6, AR7 |
Questo è quello che ho inventato finora per cercare di sostituire i valori a distanza che appaiono nella colonna A, ma non funziona.
for (i=1, i<=nrows(dt), i++,
A_List=words(column(dt, "A")[i], ",");
letters = Regex(A_List, "([A-Z]+)([0-9]+)(-)([0-9]+)", "\1");
From = Num(Regex(A_List, "([A-Z]+)([0-9]+)(-)([0-9]+)", "\2"););
To = Num(Regex(A_List, "([A-Z]+)([0-9]+)(-)([0-9]+)", "\4"););
For( x = From, x <= To, x++,
string = Char(letters) || Char(x);
Insert Into (A_List, string);
);
);
Apprezzo il vostro aiuto!
Ri: Conversione di un intervallo di caratteri alfanumerici in un elenco (da X1-3 a X1, X2, X3)Versione grezza che gestisce numeri maggiori di 9
ch_split = function({ch_string}, {default local},
first_num = regex(ch_string, "([0-9])");
num_loc = contains(ch_string, first_num);
prefix = substr(ch_string, 1, num_loc - 1);
num_list = words(substr(ch_string, num_loc), "-");
start = num(num_list[1]);
end = num(num_list[2]);
ch_list = {};
k = 0;
for (i = start, i <= end, i++,
k++;
ch_list[k] = prefix || char(i);
);
ch_list
);
a1 = "ABC20-29";
ch_split(a1);
a2 = "CH1-2";
ch_split(a2);Ri: Conversione di un intervallo di caratteri alfanumerici in un elenco (da X1-3 a X1, X2, X3)Una funzione più efficiente per più risultati è Regex Match () :
Names Default to Here( 1 );
// test case
original = "CH002-033";
result = Regex Match(
original,
"^(\w+?)(\d+)-(\d+)\b"
);
(Notare una leggera modifica al gruppo di prima acquisizione perché "+" è avido).
In questo caso, ottieni tutti i riferimenti posteriori sotto forma di elenco:
{"CH002-033", "CH", "002", "033"}
Ri: Conversione di un intervallo di caratteri alfanumerici in un elenco (da X1-3 a X1, X2, X3)Questo quasi certamente non è la soluzione più efficiente o più pulita, ma dovrebbe fare il trucco:
list = {}; // new blank list
letters = Regex("CH13-18", "([A-Z]+)([0-9]+)(-)([0-9]+)", "\1");
From = Num(Regex("CH13-18", "([A-Z]+)([0-9]+)(-)([0-9]+)", "\2"););
To = Num(Regex("CH13-18", "([A-Z]+)([0-9]+)(-)([0-9]+)", "\4"););
For( x = From, x <= To, x++,
string = Char(letters) || Char(x);
Insert Into (list, string);
);
print(list);