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: 構文エラーです。次のいずれかが必要です: ;, ANCHOR, AUTHOR, Background, BASE, BODY, BOOKMARK, BOOKMARKGEN, BOOKMARKLIST, CLOSE, COLOR, COLUMNS, COMPRESS, CONTENTS, CSSSTYLE, DISPLAY, DPI, FILE, FONTSCALE, GFOOTNOTE, GTITLE, HOST, KEYWORDS, LAYOUT, NAMED_DEST, NEWFILE, NOBACKGROUND, NOBOOKMARKGEN, NOBOOKMARKLIST, NOCOLOR, NOCONTENTS, NOGFOOTNOTE, NOGTITLE, NOPDFNOTE, NOTOC, PACKAGE, PCL, PDF, PDFMARK, PDFNOTE, PDFTOC, PRINTER, PS, RENDER、SAS、SGE、STARTPAGE、STYLE、SUBJECT、TEXT、TITLE、UNIFORM。

エラー 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 に答える