1

我有兴趣阅读文件夹 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\”中的“:”,它说

错误 22-322:语法错误,期待以下之一:;,锚,作者,背景,基础,正文,书签,书签,书签列表,关闭,颜色,列,压缩,内容,CSSSTYLE,显示,DPI,文件, FONTSCALE, GFOOTNOTE, GTITLE, HOST, KEYWORDS, 布局, NAMED_DEST, NEWFILE, NOBACKGROUND, NOBOOKMARKGEN, NOBOOKMARKLIST, NOCOLOR, NOCONTENTS, NOGFOOTNOTE, NOGTITLE, NOPDFNOTE, NOTOC, PACKAGE, PCL, PDF, PDFMARK, PDFNOTE, PDFTOC, 打印机, PS,渲染、SAS、SGE、STARTPAGE、样式、主题、文本、标题、制服。

错误 200-322:符号无法识别,将被忽略。

我也收到一个错误,上面写着

错误:符号变量名称 PDFNAME。只能包含字母、数字和下划线。

4

2 回答 2

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;.

于 2013-10-13T02:41:21.597 回答
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;
于 2013-10-13T03:19:11.277 回答