利用SAS程序来批量修改SAS程序后缀名成.TXT的方法。
代码
如下代码,三个宏参数,inpath为需要转化后缀名SAS程序所在的路径,allYN控制是否将指定路径下所有SAS程序转化成TXT后缀(所有指的是包含指定路径下存在子文件夹),outencoding控制转化后TXT纯文本的编码。
代码语言:javascript复制%macro filesas2txt(inpath=,allYN=1,outencoding=utf8); %if &allYN eq 1 %then %do; %let _pipfg=/b/s; %end; %else %do; %let _pipfg=/b; %end; data _null_; call symput("date",left(put("&sysdate"d,yymmdd10.))); call symput("date1",left(compress(put("&sysdate"d,yymmdd10.),"-"," "))); run;*删除文件夹; systask command "rd /s/q &inpath.&date1.";*睡眠0.5秒; data _null_; rc=sleep(0.5); run;
data _null_; NewDir=dcreate("&date1.","&inpath."); run;
filename _pipfile pipe "dir &inpath.*.sas &_pipfg." ; data _pipfile; infile _pipfile truncover; input fname $char1000.; put fname=; %if &allYN ne 1 %then %do; fname="&inpath."||strip(fname); %end; newfile=strip("&inpath.&date1.")||strip(kscan(fname,-1,''))||strip('.txt'); call execute( strip('filename fn')||strip(_n_)||' '||strip(quote(strip(fname)))||' encoding=any lrecl=30000 ; filename nf'||strip(_n_)||' '||strip(quote(strip(newfile)))||" lrecl=30000 encoding=&outencoding.;");run;
data _null_; set _pipfile; rc=fcopy(strip('fn')||strip(_n_),strip('nf')||strip(_n_));run;
%mend;
%filesas2txt(inpath=D:日常练习公众号文章素材修改SAS程序名,allYN=0,outencoding=utf8);
代码解读
利用systask command删除指定文件夹。删除后程序会创建此文件夹,用来存放转化后txt所在位置。当然在使用systask command时,需要让SAS暂定运行一会,留给systask command命令的执行,故而会让SAS程序的执行睡眠0.5秒。
代码语言:javascript复制*获取当前日期; data _null_; call symput("date1",left(compress(put("&sysdate"d,yymmdd10.),"-"," "))); run;*删除文件夹; systask command "rd /s/q &inpath.&date1.";*睡眠0.5秒; data _null_; rc=sleep(0.5); run;*创建文件夹; data _null_; NewDir=dcreate("&date1.","&inpath."); run;
接着利用pipe来获取指定路径下的SAS程序,通过/b/s或/b来控制获取的内容,从而来选择是否获取指定路径下的子路径下的程序。利用filename将获取的文件路径及文件名进行赋值。
代码语言:javascript复制 %if &allYN eq 1 %then %do; %let _pipfg=/b/s; %end; %else %do; %let _pipfg=/b; %end;
filename _pipfile pipe "dir &inpath.*.sas &_pipfg." ; data _pipfile; infile _pipfile truncover; input fname $char1000.; put fname=; %if &allYN ne 1 %then %do; fname="&inpath."||strip(fname); %end; newfile=strip("&inpath.&date1.")||strip(kscan(fname,-1,''))||strip('.txt'); call execute( strip('filename fn')||strip(_n_)||' '||strip(quote(strip(fname)))||' encoding=any lrecl=30000 ; filename nf'||strip(_n_)||' '||strip(quote(strip(newfile)))||" lrecl=30000 encoding=&outencoding.;");run;
利用SAS中的fcopy函数进行转化。
代码语言:javascript复制data _null_; set _pipfile; rc=fcopy(strip('fn')||strip(_n_),strip('nf')||strip(_n_));run;