2017-01-18 4 views
0

Моя проблема следующая - у меня есть макрос, который должен пересекать куски строк и использовать эти строки внутри процедуры sql. Проблема в том, что эти строки не являются простыми и компактными, могут быть пробелы, кавычки.SAS - макрос петли через фрагменты текста

ввода строки в макрос% Roz следующий:

list1,list2 
OID,in ("IDC","NPK") 
OED,in ("EDC") 
ZFP,in ("ZFP") 

макросоци- выглядит следующим образом:

%macro roz(list1,list2); 
%let n=%sysfunc(countw(&list1)); 
%do i=1 %to &n; 
    %let kanal = %scan(&list1,&i); 
    %let inlist = %scan(&list2,&i); 
proc sql; 
create table data_stor1_&kanal._file as select sum(pocet) 
    as pocet, Dch 
    from data_stor3_&kanal where Dch &inlist group by dat_poc; 
quit; 

%end; 
%mend roz; 

%roz(OID OED,'in ("IDC","NPK")' 'in ("EDC")'); 

Моя проблема заключается в том, что я не знаю, как сделать мой макрос прочитать фрагменты в списке2 и сохранить формат (кавычки, пробелы и т. д.). Я могу решить проблему ранее в своей программе, переключаясь с строк на числа, но мне любопытно, есть ли способ, как решить проблему напрямую.

Моих два в результате SQL «выбирает» должен выглядеть следующим образом:

create table data_stor1_OID_file as select sum(pocet) as pocet, Dch 
from data_stor3_OID where Dch in ("IDC","NPK") group by dat_poc; 

create table data_stor1_OED_file as select sum(pocet) as pocet, Dch 
from data_stor3_OED where Dch in ("EDC") group by dat_poc; 

Спасибо за любые предложения!

ответ

2

Используйте разделитель строк для вашего списка, который не является пространством (и не отображается в других строках).

%macro roz(list1,list2); 
%let n=%sysfunc(countw(&list1,|)); 
%do i=1 %to &n; 
    %let kanal = %scan(&list1,&i,|); 
    %let inlist = %scan(&list2,&i,|); 
proc sql; 
create table data_stor1_&kanal._file as select sum(pocet) 
    as pocet, Dch 
    from data_stor3_&kanal where Dch &inlist group by dat_poc; 
quit; 

%end; 
%mend roz; 

%roz(OID|OED,%nrstr(in ("IDC","NPK")|in ("EDC"))); 

Нечто подобное. Я не худею, вам нужны одинарные кавычки - используйте макрокоманду с целью избежать запятой, если хотите, хотя я не уверен, что вам это даже нужно.

+0

Спасибо, сейчас он работает :-) –

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

  • Нет связанных вопросов^_^