Re: [程式] SAS SQL 欄位內轉換格式
以下是完整程式碼,請直接複製到SAS即可執行。
程式構想: 利用正規表示法擷取所需部分,再進行處理。
==============================程式開始=======================
data my_data(keep= original_id new_id);
re_rule=PRXPARSE("/\d\d(\d{2})0(\d)(\d{2})/");
input original_id$8.;
match=PRXMATCH(re_rule,original_id);
if match then do;
CALL prxposn(re_rule, 1, a1_start, a1_length);
CALL prxposn(re_rule, 2, b1_start, b1_length);
CALL prxposn(re_rule, 3, c1_start, c1_length);
a1_temp=input(substr(original_id, a1_start, a1_length), 2.);
b1=substr(original_id, b1_start, b1_length);
c1=substr(original_id, c1_start, c1_length);
a1=byte(a1_temp+55);
format new_id $4.;
new_id=catx(a1, b1, c1);
end;
datalines;
00280061
00100123
00110735
00120526
00330039
00340217
00350315
;
===============================程式結束========================
※ 引述《gogostay (Go)》之銘言:
: 大略寫出你要的部分,不過應該可以更精簡,但..目前想不出來 > <
: data a1;
: input v1$ ;
: cards;
: 00280061
: 00280061
: 00280069
: ;
: run;
: proc sql ;
: create table t1 as
: select substr(v1,3,2) as s1,substr(v1,5,2) as s2,substr(v1,7,2) as s3
: from a1;
: quit;
: proc print data=t1;
: run;
: proc sql;
: create table t2 as
: select
: s1,
: case
: when s1 eq '28' then 's'
: when s1 eq '00' then '0'
: when s1 eq '01' then '1'
: else 'z'
: end as q1,
: s2,
: case
: when s2 eq '28' then 's'
: when s2 eq '00' then '0'
: when s2 eq '01' then '1'
: else 'z'
: end as q2,
: s3,
: case
: when s3 eq '28' then 's'
: when s3 eq '00' then '0'
: when s3 eq '01' then '1'
: else 'z'
: end as q3
: from t1;
: quit;
: proc print data=t2;
: run;
: proc sql;
: create table t3 as
: select catt(q1,q2,q3) as Q1
: from t2;
: quit;
: proc print data=t3;
: run;
: ※ 引述《MOONY135 (談無慾)》之銘言:
: : [軟體程式類別]:
: : 請填入軟體程式類別,例如:SAS、SPSS、R、EVIEWS...等
: : SAS
: : [程式問題]:
: : 資料處理、迴歸、敘述統計、logistic、probit...等
: : 資料處理
: : [軟體熟悉度]:
: : 請把以下不需要的部份刪除
: : 中(3個月到1年)
: : [問題敘述]:
: : 格式大概長這樣 想從資料庫裡面抓的學號格式改成常見的格式
: : 學號 切成 不需要 A1 B1 C1
: : 00280061 -> 00 28 00 61
: : A1與B1轉換成學號的格式是這樣
: : 00~09 -> 0~9 A~Z -> 10~36
: : C1則是完全取用
: : A1_TRANS B1_TRANC C1
: : 所以這樣轉換後 28->S 00->0 61->61 合併起來之後
: : 會變成S061
: : 目前我是做了另外一張轉換表欄位分別是
: : A1 A1_TRANS
: : 00 0
: : 01 1
: : . .
: : . .
: : . .
: : 28 S
: : . .
: : . .
: : 36 Z
: : 想請問有沒有辦法用轉換表去把A1 B1轉換後 創出新的表格
: : 目前是把切開的學號表跟轉換表INNER JOIN 然後用WHERE抓 但會出現奇怪的東西
: : [程式範例]:
: : 雖然張貼程式很可怕,但基本上有些程式還是要張貼才能解決
: : PROC SQL;
: : CREATE TABLE WORK.TEST1 AS
: : SELECT '學號'n,
: : Substr('學號'n, 3,2) as 'A1'n,
: : Substr('學號'n, 5,2) as 'B1'n,
: : Substr('學號'n, 7,2) as 'C1'n
: : FROM LASRLIB.'學號_TEST'n
: : ;
: : QUIT;
: : /*inner join之後在 把需要的轉換取出來*/
: : proc sql;
: : CREATE TABLE WORK.TEST2 AS
: : select '學號'n,
: : catx('','A1_TRANS'n,'B1_TRANS'n,'C1'n) as '轉換過的學號'n
: : from 轉換表,TEST1
: : where TEST1.A1=轉換表.A1 and TEST1.B1=轉換表.A1
: : ;
: : quit;
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.135.235.35
※ 文章網址: http://www.ptt.cc/bbs/Statistics/M.1409286001.A.B7E.html
推
08/29 20:29, , 1F
08/29 20:29, 1F
推
08/31 11:19, , 2F
08/31 11:19, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):