2017-01-18 12 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の部分を読み込み、書式(引用符、空白など)を保持します。文字列から数値に切り替えることで、プログラムの初期段階で問題を解決できますが、直接解決する方法があるのか​​不思議です。

私の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

ありがとう、それは今動作します:-) –

関連する問題