目录
1.1 思路
不管对数据是否熟悉,是否有数据字典,下图的读数思路都可以通用。
1.2 代码
*1.设置读入的记录数:全局变量,可设置为指定数字,全量读入设为max;
option obs=1000; /* max */
*2.import语句读入;
proc import
datafile = 'C:\Users\najin\Desktop\test.csv' /* 读入文件路径。文件格式txt、csv皆可 */
out = data-set /* 读入数据集名称:逻辑库名.数据集名 */
dbms = dlm replace;
delimiter = ','; /* 分隔符:csv默认为(,) */
datarow = 2; /* 从第几行开始读入:有标题设为2,无标题设为1 */
getnames = yes; /* 是否获取原始数据标题 */
run;
*3.截取日志中语句再次读入;
*用import语句读入时,很可能存在字段格式不正确,长度被截断等问题,因此需要修改字段格式及长度后再次读入;
data data-set ;
%let _EFIERR_ = 0; /*set the ERROR detection macro variable*/
infile 'C:\Users\najin\Documents\ZX_P_LOAN_INFO.txt' delimiter = ',' missover dsd lrecl=32767 firstobs=2 ;
informat LOAN_ID $36. ; /* 字符格式 */
informat REPORT_NO best32. ; /* 数值格式 */
informat LOAN_START_DATE yymmdd10. ; /* 日期格式 */
format LOAN_ID $36. ;
format REPORT_NO best12. ;
format LOAN_START_DATE yymmdd10. ;
input
LOAN_ID $ /* 字符格式 */
REPORT_NO /* 数值格式 或 日期格式 */
LOAN_START_DATE
;
if _ERROR_ then call symputx('_EFIERR_',1); /* set ERROR detection macro variable */
run;
*4.封装成宏;
*封装为名为read_cusTab1的宏,其中fp、ds、obs_count为宏参数,执行时只须给参数赋值,SAS会进行相应代码替换;
*加入了编码转换(encoding = utf8)、局部控制变量(options obs);
%macro read_cusTab1(fp, ds, obs_count);
data &ds.;
options obs=&obs_count.;
%let _EFIERR_ = 0; /* set the ERROR detection macro variable */
infile &fp. delimiter = ',' MISSOVER DSD lrecl=32767 firstobs=2 encoding = utf8;
informat LOAN_ID $36. ; /* 字符格式 */
informat REPORT_NO best32. ; /* 数值格式 */
informat LOAN_START_DATE yymmdd10. ; /* 日期格式 */
format LOAN_ID $36. ;
format REPORT_NO best12. ;
format LOAN_START_DATE yymmdd10. ;
input
LOAN_ID $ /* 字符格式 */
REPORT_NO /* 数值格式 或 日期格式 */
LOAN_START_DATE
load_dat
;
if _ERROR_ then call symputx('_EFIERR_',1); /* set ERROR detection macro variable*/
run;
%mend read_cusTab1;
*5.宏的调用;
*宏的调用分两种情况:本程序直接调用;在另一个程序中调用;
*5.1 本程序直接调用;
%read_cusTab1('D:\data\sas_file\zx\RAWDATA\GZNS_cxrz.csv', data-set, max);
*5.2 在另一个程序中调用;
*注意:该种方式调用,被引用的宏会被完整的执行;
%include '程序路径\程序名称';
*示例如下;
%include "/data/home/app/RDS/ZYH/ZX/PGM/SCNX_READ_DATA.SAS"; /* 路径+宏名称 */
%let ENV = %sysget(MACRO_CV_ENV); /* 创建宏变量的套了一个宏变量 */
%INCLUDE "&ENV"; /* 调用宏 */