我有一個關于在 SAS 中使用正則運算式的問題。
我的資料集看起來像這樣:
| ID | 代碼 |
|---|---|
| 101 | K2K5K8F10F26F2 |
| 102 | L7P13P4 |
| 103 | L1 |
我希望它看起來像這樣:
| ID | 代碼 |
|---|---|
| 101 | K2 |
| 101 | K5 |
| 101 | K8 |
| 101 | F10 |
| 101 | F26 |
| 101 | F2 |
| 102 | L7 |
| 102 | P13 |
| 102 | P4 |
| 103 | L1 |
一開始我認為先分配新列然后按行更容易做到這一點。
我的嘗試如下:
proc ds2;
data Codes (overwrite=yes);
dcl char(16) code1 code2 code3 code4 code5 code6;
dcl double re;
keep code1 code2 code3 code4 code5 code6;
retain re;
method init();
dcl varchar(32) expression;
expression = '/(\w \d ) /';
re=prxparse(expression);
if missing( re ) then do;
put 'ERROR: Invalid expression ' expression;
stop;
end;
end;
method run();
set mytable;
code1 = 'ERROR';
if prxmatch(re, Code) then
do;
code1=prxposn(re, 0, Code);
code2=prxposn(re, 1, Code);
code3=prxposn(re, 2, Code);
code4=prxposn(re, 3, Code);
code5=prxposn(re, 4, Code);
code6=prxposn(re, 5, Code);
end;
else do;
code1='0';
end;
end;
enddata;
run;
quit;
proc print data=Codes;
run;
quit;
然而,什么都沒有改變。結果,我得到的 code1 和 code2 列與初始資料集中的 Code 列完全相同。我真的很感激這方面的任何幫助,因為正則運算式不是我的強項。我還將 code1 = 'ERROR' 和后來的 code1 = '0' 放在一起,以檢查代碼是否有效。
需要注意的是,我創建了最多 code6 作為試用。我無法知道每個 ID 的確切代碼數。但是,我確實知道代碼必須始終是一個字母與一位或兩位數字的組合,它也可以采用 Z12-9 形式(因此,一個字母后跟兩位數字,然后是一個破折號,然后是一位數字)。
先感謝您!
uj5u.com熱心網友回復:
回答這個正則運算式部分,你的正則運算式是錯誤的,我認為prxposn可能也是錯誤的。
\w匹配數字以及 alpha,因此\w 將獲取所有字串。您需要使用[A-Z],或使用\w ?使用不那么激進的匹配來僅獲取單個字母然后數字集。
此外,這里的正確方法是call prxnext,prxposn匹配正則運算式中的每個括號匹配,因此 1 是第一個, 2 是第二個,但(something) 只有一個括號匹配。call prxnext將繼續查找單個匹配項的更多匹配項,您可以使用它來獲取匹配位。
這里同樣是在簡單的資料步驟中,但 DS2 將是相似的。
data want;
set have;
rx = prxparse('/[A-Z] \d /ios');
start = 1;
do until (pos eq 0);
call prxnext(rx,start,length(code),code,pos,len);
if pos gt 0 then do;
w = substr(code,pos,len);
put w=;
output;
end;
end;
run;
uj5u.com熱心網友回復:
我發現這是一個特別好的用例call scan,正則運算式的效率幾乎沒有。在這里,我call scan用來找到(總是單個)字母的“詞邊界”,然后抓住它加上下一個字母(或詞尾)之前的任何內容。
data have;
length code $20 ;
input id code $;
datalines;
101 K2K5K8F10F26F2
102 L7P13P4
103 L1
;;;;
run;
data want;
set have;
do count = 1 to countw(code,,'a');
call scan(code,count,pos,len,,'a');
w = substr(code,pos-1,len 1);
output;
end;
run;
我認為這在 DS2 中和資料步驟一樣適用,如果這是必需的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/385028.html
上一篇:正則運算式在方括號外查找字串
