SAS-批量修改.sas后缀成.txt

2020-06-06 22:52:24 浏览数 (1)

利用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;
sas

0 人点赞