2013-10-12 1 views
1

Я заинтересован в чтении каждого набора данных SAS в папке C: \ Users и создании pdf-файла однопроцессорного процесса для каждого из этих наборов данных SAS. То есть, если у меня есть 50 наборов данных в C: \ Users, мне бы хотелось 50 файлов PDF.Как читать каждый набор данных SAS в определенной папке и создавать отдельные 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: Ошибка синтаксиса, ожидая одного из следующее:;, Якорь, АВТОР, ФОН, БАЗА, тело, закладки, BOOKMARKGEN, BOOKMARKLIST, близко, цвет, КОЛОННЫ, КОМПРЕСС, СОДЕРЖАНИЕ, CSSSTYLE, дисплей, DPI, FILE, FONTSCALE, GFOOTNOTE, GTITLE, ХОЗЯИН, KEYWORDS, LAYOUT, NAMED_DEST, NEWFILE, NOBACKGROUND, NOBOOKMARKGEN, NOKOOKMARKLIST, NOCOLOR, NOCONTENTS, NOGFOOTNOTE, NOGTITLE, NOPDFNOTE, NOTOC, ПАКЕТ, PCL, PDF, PDFMARK, PDFNOTE, PDFTOC, PRINTER, PS, RENDER, SAS, SGE, STARTPAGE, STYLE, SUBJECT, TEXT, TITLE, UNIFORM.

ОШИБКА 200-322: Символ не распознается и будет игнорироваться.

Я также получаю ошибку, которая говорит

ОШИБКА: Символическое имя переменной PDFNAME. должен содержать только буквы, цифры и символы подчеркивания.

ответ

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; 
+0

Спасибо, это сработало! Не возражаете, если я спрошу вас, как вы это сделаете? Я очень новичок в макросах SAS и не имею формального обучения в них. Мой мыслительный процесс больше «как мне это сделать?» а не «что это лучший способ сделать это?» и я хотел бы изменить это. – NewNameStat

+0

То, что вы сделали, было на самом деле довольно хорошим. Одна вещь, которую я предлагаю, - никогда не помещать что-либо в каталог библиотеки SAS. Создайте новый каталог для своих отчетов. Это просто чище, потому что библиотека SAS может содержать объекты, отличные от файлов «* .sas7bdat». Кроме того, было бы «безопаснее» использовать приведенный ниже вид SASHELP.VMEMBER, а не синтаксический анализ команды DIR. И есть много информации о макрообработке; возьмите час или около того и прочитайте документы (а не только руководства по синтаксису). В общем, вы сделали очень хорошую программу. – BellevueBob

2

Вы уже об этом думаете. Создайте библиотеку, указывающую на этот каталог, и используйте SASHELP.VMEMBER. Это представление дает вам информацию о каждом наборе данных SAS в каждой определенной вами библиотеке.

Тем не менее, ваша проблема здесь:

data _null_;           
call symput('pdfname'||left(count),cat("C:\Users\",&&read&i,".pdf"));      
run; 

У вас нет входного SET заявления. Переменная COUNT в неинициализированной. Поскольку вы делаете это внутри цикла макросов, нет необходимости добавлять счет к имени макроса PDFNAME.

Далее & & & Я собираюсь решить проблему. Вам нужно поставить кавычки вокруг ссылки или что шаг данных будет считать, что строка - это имя переменной, которое также неинициализировано. Таким образом, у вас есть эквивалент %let pdfname. = C:\Users\..pdf;.

Смежные вопросы