作者statexpert (statexpert)
站内Statistics
标题Re: [程式] SAS SQL 栏位内转换格式
时间Fri Aug 29 12:19:58 2014
以下是完整程式码,请直接复制到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://webptt.com/cn.aspx?n=bbs/Statistics/M.1409286001.A.B7E.html
1F:推 gogostay: 赞!!!谢谢 08/29 20:29
2F:推 lsshno1: perl expression 08/31 11:19