Konvertieren eines Bereichs alphanumerischer Zeichen in eine Liste (X1-3 in X1,X2,X3)Hallo,
Ich versuche, eine Reihe alphanumerischer Zeichen in eine Liste umzuwandeln.Ich bin ziemlich neu bei JSL und weiß nicht genau, wie ich das machen soll. Das möchte ich erreichen:
Original: CH1-3
Rückgabe: CH1,CH2,CH3
Das Zeichenpräfix enthält nicht immer zwei Zeichen (könnte beispielsweise CH1-3 oder X5-8 sein).
Ich weiß, wenn ich einen Bereich von nur zwei Zahlen hätte, wie CH1-2, könnte ich das folgende Skript verwenden, um zu bekommen, was ich will:
Regex("CH1-2", "([A-Z]+)([0-9]+)(-)([0-9]+)", "\1\2,\1\4", GLOBALREPLACE);Was CH1,CH2 zurückgibt
Allerdings habe ich keine Ahnung, wie das bei Bereichen mit mehr als zwei Zahlen geht.
Jede Hilfe wäre sehr dankbar!
Betreff: Konvertieren eines Bereichs alphanumerischer Zeichen in eine Liste (X1-3 in X1,X2,X3)Dieses Skript veranschaulicht eine Möglichkeit, dies zu tun:
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;
);Betreff: Konvertieren eines Bereichs alphanumerischer Zeichen in eine Liste (X1-3 in X1,X2,X3)Vielen Dank für Ihre Antwort! Es ist sehr hilfreich.
Ich habe versucht, es mit dem, was ich versuche, in Einklang zu bringen, aber ich habe einige Schwierigkeiten. Vielleicht könnten Sie mir noch einmal Ihre Hilfe zukommen lassen?
Ich habe es mit einer Datentabelle wie der folgenden zu tun, in der mehrere Spalten mit Daten gefüllt sind. Ich versuche, die Bereichswerte überall dort zu ersetzen, wo sie vorkommen
Original:
| A | B | C |
| CH1-2,CH17,CH6-8 | MR101-103 | U2 |
| T7 | P4-5 | AR6-7 |
Gewünscht:
| A | B | C |
| CH1,CH2,CH17,CH6,CH7,CH8 | MR101, MR102, MR103 | U2 |
| T7 | P4, P5 | AR6, AR7 |
Dies ist, was ich mir bisher ausgedacht habe, um zu versuchen, die in Spalte A angezeigten Bereichswerte zu ersetzen, aber es funktioniert nicht.
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);
);
);
Ich schätze Ihre Hilfe!
Betreff: Konvertieren eines Bereichs alphanumerischer Zeichen in eine Liste (X1-3 in X1,X2,X3)Rohversion, die Zahlen größer als 9 verarbeitet
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);Betreff: Konvertieren eines Bereichs alphanumerischer Zeichen in eine Liste (X1-3 in X1,X2,X3)Eine effizientere Funktion für mehrere Ergebnisse ist Regex-Match() :
Names Default to Here( 1 );
// test case
original = "CH002-033";
result = Regex Match(
original,
"^(\w+?)(\d+)-(\d+)\b"
);
(Beachten Sie eine leichte Änderung an der ersten Erfassungsgruppe, da „+“ gierig ist.)
In diesem Fall erhalten Sie alle Rückverweise in Listenform:
{"CH002-033", "CH", "002", "033"}
Betreff: Konvertieren eines Bereichs alphanumerischer Zeichen in eine Liste (X1-3 in X1,X2,X3)Dies ist mit ziemlicher Sicherheit nicht die effizienteste oder sauberste Lösung, sollte aber den Zweck erfüllen:
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);