Conversion d'une plage de caractères alphanumériques en une liste (X1-3 à X1,X2,X3)Bonjour,
J'essaie de convertir une plage de caractères alphanumériques en une liste.Je suis assez nouveau dans JSL et je ne sais pas exactement comment procéder. Voici ce que j'aimerais obtenir :
Original : CH1-3
Retour : CH1, CH2, CH3
Le préfixe de caractère ne contient pas toujours deux caractères (pourrait être CH1-3 ou X5-8 par exemple).
Je sais que si j'avais une plage de seulement deux nombres, comme CH1-2, je pourrais utiliser le script suivant pour obtenir ce que je veux :
Regex("CH1-2", "([A-Z]+)([0-9]+)(-)([0-9]+)", "\1\2,\1\4", GLOBALREPLACE);Qui renvoie CH1,CH2
Cependant, je n'ai aucune idée de comment faire cela pour les plages avec plus de deux nombres.
Toute assistance sera grandement appréciée!
Re : Conversion d'une plage de caractères alphanumériques en une liste (X1-3 en X1, X2, X3)Ce script illustre une façon de le faire :
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 : Conversion d'une plage de caractères alphanumériques en une liste (X1-3 en X1, X2, X3)Merci pour votre réponse! C'est très utile.
J'ai essayé de l'intégrer à ce que j'essaie de faire, mais j'ai quelques difficultés. Peut-être pourriez-vous me prêter à nouveau votre aide ?
J'ai affaire à un tableau de données comme celui ci-dessous, où j'ai plusieurs colonnes remplies de données. J'essaie de remplacer les valeurs à distance partout où elles se produisent
Original :
| UN | B | C |
| CH1-2, CH17, CH6-8 | MR101-103 | U2 |
| T7 | P4-5 | AR6-7 |
Voulu:
| UN | B | C |
| CH1,CH2,CH17,CH6,CH7,CH8 | MR101, MR102, MR103 | U2 |
| T7 | P4,P5 | AR6, AR7 |
C'est ce que j'ai trouvé jusqu'à présent pour essayer de remplacer les valeurs de plage qui apparaissent dans la colonne A, mais cela ne fonctionne pas.
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);
);
);
J'apprécie ton aide!
Re : Conversion d'une plage de caractères alphanumériques en une liste (X1-3 en X1, X2, X3)Version brute qui gère les nombres supérieurs à 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 : Conversion d'une plage de caractères alphanumériques en une liste (X1-3 en X1, X2, X3)Une fonction plus efficace pour plusieurs résultats est Correspondance Regex() :
Names Default to Here( 1 );
// test case
original = "CH002-033";
result = Regex Match(
original,
"^(\w+?)(\d+)-(\d+)\b"
);
(Notez un léger changement par rapport au premier groupe de capture car "+" est gourmand.)
Dans ce cas, vous obtenez toutes les références arrière sous forme de liste :
{"CH002-033", "CH", "002", "033"}
Re : Conversion d'une plage de caractères alphanumériques en une liste (X1-3 en X1, X2, X3)Ce n'est certainement pas la solution la plus efficace ou la plus propre, mais devrait faire l'affaire :
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);