如何读取某个文件夹中的每个SAS数据集并为每个文件夹创建单独的PDF输出?

时间:2013-10-12 21:42:24

标签: pdf macros sas

我有兴趣阅读文件夹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。必须只包含字母,数字和下划线。

2 个答案:

答案 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;