Convertir un rango de caracteres alfanuméricos en una lista (X1-3 a X1, X2, X3)Hola,
Estoy tratando de convertir un rango de caracteres alfanuméricos en una lista. Soy bastante nuevo en JSL y no estoy seguro de cómo hacer esto. Esto es lo que me gustaría lograr:
Orginal: CH1-3
Regreso: CH1, CH2, CH3
El prefijo de caracteres no siempre contiene dos caracteres (podría ser CH1-3 o X5-8 por ejemplo).
Sé que si tuviera un rango de solo dos números, como CH1-2, podría usar el siguiente script para obtener lo que quiero:
Regex("CH1-2", "([A-Z]+)([0-9]+)(-)([0-9]+)", "\1\2,\1\4", GLOBALREPLACE);Lo que devuelve CH1, CH2
Sin embargo, no tengo idea de cómo hacer esto para rangos con más de dos números.
Cualquier ayuda sería muy apreciada!
Re: Convertir un rango de caracteres alfanuméricos en una lista (X1-3 a X1, X2, X3)Este script ilustra una forma de hacerlo:
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;
);Re: Convertir un rango de caracteres alfanuméricos en una lista (X1-3 a X1, X2, X3)¡Gracias por su respuesta! Es muy útil.
He estado tratando de incoperarlo con lo que estoy tratando de hacer, pero estoy teniendo algunas dificultades. ¿Quizás podrías prestarme tu ayuda otra vez?
Estoy tratando con una tabla de datos como la de abajo, donde tengo varias columnas llenas de datos. Estoy tratando de reemplazar los valores de rango dondequiera que ocurran
Orginal
| UNA | segundo | do |
| CH1-2, CH17, CH6-8 | MR101-103 | U2 |
| T7 | P4-5 | AR6-7 |
Deseado:
| UNA | segundo | do |
| CH1, CH2, CH17, CH6, CH7, CH8 | MR101, MR102, MR103 | U2 |
| T7 | P4, P5 | AR6, AR7 |
Esto es lo que he encontrado hasta ahora para tratar de reemplazar los valores de rango que aparecen en la columna A, pero no está funcionando.
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);
);
);
¡Aprecio tu ayuda!
Re: Convertir un rango de caracteres alfanuméricos en una lista (X1-3 a X1, X2, X3)Versión cruda que maneja números mayores a 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);Re: Convertir un rango de caracteres alfanuméricos en una lista (X1-3 a X1, X2, X3)Una función más eficiente para resultados múltiples es Partido de expresiones regulares () :
Names Default to Here( 1 );
// test case
original = "CH002-033";
result = Regex Match(
original,
"^(\w+?)(\d+)-(\d+)\b"
);
(Tenga en cuenta un ligero cambio en el primer grupo de captura porque "+" es codicioso.)
En este caso, obtiene todas las referencias anteriores en forma de lista:
{"CH002-033", "CH", "002", "033"}
Re: Convertir un rango de caracteres alfanuméricos en una lista (X1-3 a X1, X2, X3)Es casi seguro que esta no es la solución más eficiente o limpia, pero debería hacer el truco:
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);