我有兴趣阅读文件夹C:\ Users中的每个SAS数据集,并在每个SAS数据集上创建proc单变量的pdf输出。也就是说,如果我在C:\ Users中有50个数据集,我想要50个pdf文件。
我在指定pdf的名称及其应该去的位置时遇到问题。以下是我的代码:
filename DIRLIST pipe 'dir "C:\Users\*.sas7bdat" ';
data dirlist;
infile dirlist lrecl=200 truncover;
input line $200.;
if input(substr(line,1,10), ?? mmddyy10.) = . then delete;
length file_name $ 150;
file_name=scan(scan(line,-1," "),1,".");
keep file_name;
data _null_;
set dirlist end=end;
count+1;
call symput('read'||left(count),left(trim(file_name)));
if end then call symput('max',count);
run;
options mprint symbolgen;
%macro stack;
%do i=1 %to &max;
data _null_;
call symput('pdfname'||left(count),cat("C:\Users\",&&read&i,".pdf"));
run;
ods pdf file=&&pdfname&i;
proc univariate data = &&read&i noprint;
run;
ods pdf close;
%end;
%mend stack;
%stack;
我收到一条错误,突出显示“C:\ Users \”中的“:”,并显示
ERROR 22-322:语法错误,期望以下之一:;,ANCHOR,AUTHOR,BACKGROUND, BASE,BODY,BOOKMARK,BOOKMARKGEN,BOOKMARKLIST,CLOSE,COLOR,COLUMNS,COMPRESS, 内容,CSSSTYLE,DISPLAY,DPI,文件,FONTSCALE,GFOOTNOTE,GTITLE,HOST, 关键词,布局,NAMED_DEST,NEWFILE,NOBACKGROUND,NOBOOKMARKGEN, NOBOOKMARKLIST,NOCOLOR,NOCONTENTS,NOGFOOTNOTE,NOGTITLE,NOPDFNOTE,NOTOC, 包装,PCL,PDF,PDFMARK,PDF注意,PDFTOC,PRINTER,PS,RENDER,SAS,SGE, STARTPAGE,STYLE,SUBJECT,TEXT,TITLE,UNIFORM。
ERROR 200-322:符号无法识别,将被忽略。
我也收到一条错误,上面写着
错误:符号变量名称PDFNAME。必须只包含字母,数字和下划线。
答案 0 :(得分:2)
你在想这个。创建一个指向该目录的库并使用SASHELP.VMEMBER。此视图为您提供有关已定义的每个库中每个SAS数据集的信息。
那就是说,你的问题就在这里:
data _null_;
call symput('pdfname'||left(count),cat("C:\Users\",&&read&i,".pdf"));
run;
您没有输入SET
声明。未初始化的变量COUNT。因为您在宏循环中执行此操作,所以无需向PDFNAME宏名称附加计数。
进一步&& read& i将解析成一个字符串。你需要在引用周围加上引号,或者数据步骤会认为字符串是一个未初始化的变量名。所以你有相当于%let pdfname. = C:\Users\..pdf;
。
答案 1 :(得分:1)
你非常接近,但你有一些错误。这是一个修订版。我添加了对所有代码更改的评论。我不会这样做,但你的问题实际上是关于语法错误。
filename DIRLIST pipe 'dir "C:\Users\*.sas7bdat" ';
/* Added LIBREF */
libname MYDATA 'C:\Users\';
data dirlist;
infile dirlist lrecl=200 truncover;
input line $200.;
/* Changed informat (worked for me) */
if input(substr(line,1,10), yymmdd10.) = . then delete;
length file_name $ 150;
file_name=scan(scan(line,-1," "),1,".");
keep file_name;
run;
data _null_;
set dirlist end=end;
count+1;
call symput('read'||left(count),left(trim(file_name)));
if end then call symput('max',count);
run;
options mprint symbolgen;
%macro stack;
ods listing close; /* Added this line */
ods results noresults; /* Added this line */
%do i=1 %to &max;
data _null_;
/* Next line entirely different; cause of one syntax error */
call symput(cat('pdfname',"&i"),cat('C:\Users\',"&&read&i",'.pdf'));
run;
/* Added quotes, cause of the other syntax error */
ods pdf file="&&pdfname&i";
/* Added LIBREF and removed NOPRINT option (NOPRINT actually prevents the output)*/
proc univariate data = MYDATA.&&read&i;
run;
ods pdf close;
%end;
ods listing; /* Added this line */
ods results; /* Added this line */
%mend stack;
%stack;