2013-07-18 2 views
-2

Я хочу использовать вызов макроса на шаге данных. Ниже приведен макрос и его вызов на шаге данных, но это не работает. Можете ли вы, ребята, предложить вам способ заставить его работать.Как использовать макрос SAS в наборе данных SAS

%macro xscan(string, delimiter, word_number); 

%let len1=%length(&string); /*Computing the length of the string*/ 
%let len=%eval(&len1+1); 
%let sub=%scan(&string,&word_number,"&delimiter"); 

%if &word_number ge 0 %then %do; 
%let pos=%index(&string,&sub); /* Locate the position while reading left to right*/ 
%end; 

%if &word_number lt 0 %then %do; 
data _null_; 
pos=find("&string","&sub",-&len); 
call symput("pos",pos); 
run; 
%end; 

%let strg=%substr(&string,&pos); /* Extract the substring*/ 

%put the string is &strg; 
%mend; 

data work.in_data; 
length in_string $50; 
in_string = “a bb ccc dddd bb eeeee”; 
output; 
in_string = “aa b cc aa dee”; 
output; 
run; 

data work.out_data; 
set work.in_data; 
length sub_str $50; 
start_word_num = -(_n_ +1); 
sub_str = %xscan(in_string,’ ‘, start_word_num); 
run; 

proc print; run; 
+1

Вопросов, касающихся проблемы с кодом Вы написали сусло ** описать конкретную проблему ** и включают действительное код для его воспроизведения. См. [SSCCE.org] (http://sscce.org/) для руководства. Это также помогло бы, если бы вы описали, что это ** должно делать **. – JDB

+0

Действительно. Просто сбрасывать ваш код и говорить, что он не работает, недостаточно; это должно быть поставлено как проблема, которая достаточно обобщена, чтобы кто-то другой мог учиться у нее. – Joe

+0

Если вы хотите создать функцию, которая будет использоваться в datastep, посмотрите в «PROC FCMP», а не пытайтесь использовать макрос для этого. Кроме того, перечитайте ответ и комментарии к другому вопросу, который вы задали, потому что похоже, что вы не совсем понимаете, что там было сказано. –

ответ

2

Если макрос будет использоваться внутри datastep, напишите его более просто, используя только datastep функции вместо того, чтобы сделать это сложно с макро-функций. Существует множество строковых функций SAS, которые позволят вам выполнить то, что вы хотите, в гораздо меньшем количестве кода.

0

Данные шаги очень гибкие, и они позволяют вам манипулировать вашими данными в очень гибкий день, я бы рекомендовал вам реорганизовать код, чтобы использовать только datastep, однако, если вы все еще хотите использовать его так, как вы используйте его прямо сейчас call execute. Вот пример:

data _null_ ; 
input name $ value !$ ; 
call execute 
(‘%global ‘ 
llname~l ‘;’ II 
‘%let’ Ilnamell =’ [1 
value II ‘;’ 
); 
cards ; 
abc xyz 
; 

Обратитесь к этим документам для дальнейшего чтения: http://www2.sas.com/proceedings/sugi30/154-30.pdf и http://www2.sas.com/proceedings/sugi22/CODERS/PAPER70.PDF

+0

В случае OPs 'call execute' не будет работать, потому что макрофункция не является чистым макрокодом, она содержит шаги данных и т. Д. Если он исправит, что этот подход будет прекрасен. –