我正在将一些 R 代码转换为 SAS EG (V8.3.2.140) 中程序的 SQL PROC,但是我陷入困境。我需要一些帮助从列中提取字母数字字符串并使用该字母数字字符串创建一个新列。
在 R 中,我使用一个名为
rebus
的包来创建模式,随后我使用 mutate
/str_extract
将其放置在新列中。
图案看起来像这样:
c(
optional(ALPHA) %R%
ALPHA %R%
ALPHA %R%
DGT %R%
DGT %R%
ALPHA %R%
ALPHA %R%
optional(ALPHA) %R%
DGT %R%
optional(DGT) %R%
optional(ALPHA)
)
所以是一个可选字符,后面跟着一个字符,后面跟着一个字符,后面跟着一个数字,等等。它看起来像这样:ABC01DE02 或 ABC01DE02A。我需要两个版本。
我尝试从中提取的字符串中字母数字代码的位置可能会有所不同,因此使用该位置不起作用。但字符始终为大写字母。
希望这能为解决方案提供足够的信息。
这听起来像是正则表达式的工作。下面的正则表达式应该可以完成这项工作:
[A-Za-z]{0,3}\d{2}[A-Za-z]{2,3}\d{1,2}[A-Za-z]
您需要使用数据步骤而不是 SQL 来完成此操作:
data want;
length string $25.;
input string$;
retain regexid;
if(_N_ = 1) then
regexid = prxparse('/[A-Za-z]{0,3}\d{2}[A-Za-z]{2,3}\d{1,2}[A-Za-z]?/');
/* If a match is found, extract the string */
if(prxmatch(regexid, string)) then do;
call prxsubstr(regexid, string, pos, len);
extract = substr(string, pos, len);
end;
drop pos len regexid;
datalines;
KJ3828ADIJABC01DE02292LZ
FJS9EO2ABC01DE02A92UJDDA
;
run;
string extract
KJ3828ADIJABC01DE02292LZ ABC01DE02
FJS9EO2ABC01DE02A92UJDDA ABC01DE02A