ある範囲の英数字をリストに変換する(X1-3からX1、X2、X3)こんにちは、
ある範囲の英数字をリストに変換しようとしています。 私はJSLにかなり慣れていませんし、これをどのように実行するかについては正確にはわかりません。これが私が達成したいことです。
元:CH1-3
戻る:CH1、CH2、CH3
文字の接頭辞には、必ずしも2文字が含まれるわけではありません(たとえば、CH1-3やX5-8など)。
CH1-2のように2つの数字しかない場合は、次のスクリプトを使用して必要なものを取得できます。
Regex("CH1-2", "([A-Z]+)([0-9]+)(-)([0-9]+)", "\1\2,\1\4", GLOBALREPLACE);CH1、CH2を返す
しかし、私はこれを2つ以上の数の範囲に対して行う方法を知りません。
任意の援助は大歓迎です!
再:リストへの英数字の範囲の変換(X 1 - 3からX 1、X 2、X 3)このスクリプトはその方法を示しています。
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;
);再:リストへの英数字の範囲の変換(X 1 - 3からX 1、X 2、X 3)御返答いただき有難うございます!とても助かります。
私は自分がやろうとしていることとそれを相互運用しようとしていますが、いくつかの困難を抱えています。多分あなたは私にあなたの援助を再び貸すことができますか?
以下のようなデータテーブルを扱っています。ここでは、複数の列にデータが入力されています。私はそれらが起こるところはどこでも範囲の値を置き換えることを試みています
元:
| A | B | C |
| CH1-2、CH17、CH6-8 | MR101-103 | U2 |
| T7 | P4-5 | AR6-7 |
希望:
| A | B | C |
| CH1、CH2、CH17、CH6、CH7、CH8 | MR101、MR102、MR103 | U2 |
| T7 | P4、P5 | AR6、AR7 |
これが、列Aに表示される範囲値を置き換えるためにこれまでに思いついたことですが、うまくいきません。
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);
);
);
私はあなたの助けに感謝します!
再:リストへの英数字の範囲の変換(X 1 - 3からX 1、X 2、X 3)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);再:リストへの英数字の範囲の変換(X 1 - 3からX 1、X 2、X 3)複数の結果に対してより効率的な関数は正規表現の一致() :
Names Default to Here( 1 );
// test case
original = "CH002-033";
result = Regex Match(
original,
"^(\w+?)(\d+)-(\d+)\b"
);
( "+"は欲張りなので、最初のキャプチャグループへのわずかな変更に注意してください。)
この場合、すべての後方参照をリスト形式で取得します。
{"CH002-033", "CH", "002", "033"}
再:リストへの英数字の範囲の変換(X 1 - 3からX 1、X 2、X 3)これはほぼ確実に最も効率的で最もクリーンな解決策ではありませんが、うまくいくはずです。
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);