能否不使用赋值语句编写SAS程序读取两类数据生成PERSONEL临时数据集?
问题:无赋值语句实现SAS数据读取需求
参考数据
以下为目标数据的参考格式:
ID Birthday Monthly Salary P222 2 March 1976 9,600 P013 13 June 1955 31,450 S015 12 September 1966 27,500
ID规则:首字符为职业缩写("P"代表教授,"S"代表职员),后接三位数字。
待读取的两类数据
(*)类数据
P222 2Mar1976 9,60000 P013 13Jun1955 31,45000 S015 12Sep1966 27,50000
(**)类数据
P222 2Mar1976 $9,6,00 *************** P013 13Jun1955 $31,450 ************** S015 12Sep1966 $27,500 ***********
需求
编写SAS程序读取上述两类数据,创建临时数据集PERSONEL,包含以下变量:
- 字符型:
ID(完整ID,如"P222")、OCCUPATION(职业缩写,如"P") - 数值型:
BIRTHDAY(SAS日期值,如27821)、YEAR(出生年份,如1976)、SALARY(月薪数值,如9600)
提问:是否可以不使用赋值语句实现该需求?
回答
可以不使用显式赋值语句实现需求,通过SAS INPUT语句的位置定位、专用格式以及行过滤功能即可完成,分别处理两类数据如下:
一、处理(*)类数据的SAS程序
利用位置读取指定变量,结合SAS内置的日期、数值格式完成转换:
data PERSONEL; infile datalines truncover; /* 按位置精准读取各变量: - 先读完整ID,再从行首截取职业缩写 - 用date9.格式将日期字符串转为SAS日期值 - 直接从日期字符串的年份起始位读取四位数字作为YEAR - 用comma6.格式去除薪资中的逗号,转换为数值(若输入的9,60000为笔误,实际应为9,600,改用comma5.即可直接得到9600) */ input @1 ID $4. @1 OCCUPATION $1. @6 BIRTHDAY date9. @13 YEAR 4. @16 SALARY comma6. ; datalines; P222 2Mar1976 9,60000 P013 13Jun1955 31,45000 S015 12Sep1966 27,50000 ; run;
说明:
@1重复定位行首,直接截取职业缩写,无需用substr赋值date9.格式自动将2Mar1976转换为SAS日期值27821- 从日期字符串的固定位置读取年份,直接生成
YEAR变量 comma6.格式自动处理带逗号的薪资,转换为纯数值
二、处理(**)类数据的SAS程序
需先过滤掉含*的分隔行,再读取有效数据,同时处理薪资中的多余逗号:
data PERSONEL; infile datalines truncover; /* 先锁定当前行,检查是否为分隔行 */ input @; if index(_infile_, '*') = 0 then do; /* 读取有效数据: - 跳过$符号读取薪资,用comma6.格式自动去除多余逗号 - 其余变量读取逻辑同(*)类数据 */ input @1 ID $4. @1 OCCUPATION $1. @6 BIRTHDAY date9. @13 YEAR 4. @21 SALARY comma6. ; end; datalines; P222 2Mar1976 $9,6,00 *************** P013 13Jun1955 $31,450 ************** S015 12Sep1966 $27,500 *********** ; run;
说明:
input @保持行指针不移动,先判断行内容是否为分隔行index(_infile_, '*')=0筛选出有效数据行,无需赋值语句comma6.格式自动处理薪资中的多个逗号,将$9,6,00转换为9600
内容的提问来源于stack exchange,提问作者PowerPoint Trenton
相关产品推荐
相关产品推荐

