4
%macro name_modal();
/*Create macro variables which contain the modalities of variables*/
%do i=1 %to &num_Var;
    data _null_;
        set  &lib..Table_variable_modal_&i.;
        call symputx('num_Mod'||compress(put(&i,4.)),_N_,"G");
        call symputx('table'||compress(put(&i,4.))||'modal'||compress(put(_N_,4.)),compress(&&name_Var&i.),"G");
    run;

%end;

/*Display modalities by variable*/
%do i=1 %to &num_Var;
    %put &&name_Var&i. has &&num_Mod&i. modalities ;
    %do j=1 %to &&num_Mod&i.;
        %put %nrstr(&&tableb&i.modal&j.);
    %end;
%end;
%mend name_modal;
%name_modal();

コードが自己文書化されていることを願っています。ここで問題を説明します。変数によってモダリティを表示するのに役立つプログラムの2番目に進むまで、すべてが正常に機能しています。

たとえば、マクロ変数にストックされているモダリティの名前が
$ 100%BLO、
100%COLOR、
AVON&RAGOBERT、
BALLANTINE'S、
L'OREAL、
AT&T、
UVA
などの
場合、%putを適切に使用できません。%bquoteと%nrstrを使用してみましたが、問題は解決しません。これまでのところ、私が見ることができる唯一の解決策は、モダリティの名前を変更することですが、名前はクライアントからのものであるため、データを修正する可能性はありません。

ありがとうございました

4

2 に答える 2

2

数回試したところ、%superqこの問題を解決できることがわかりました。マクロで特殊文字を処理するのは面倒です。このページでは、マクロ引用に関するいくつかの役立つヒントを提供します。

ここでコードを次のように簡略化しました

更新:ダブルループの場合にします。

data test;
 input name ~ &  $15.;
 datalines;
 100% BLO
 100% COLOR
 AVON & RAGOBERT
 BALLANTINE'S
 L'OREAL
 AT&T
 U-V-A
 ;
run;

%macro name_modal();
/*Create macro variables which contain the modalities of variables*/
%do i=1 %to 4;
    data _null_;
     set  test;
     call symputx('num_Mod1',_N_,"G");
     call symputx('tableb'||compress(put(&i,4.))||'modal'||compress(put(_N_,4.)),name,"G");
    run;
%end;

   %do i=1 %to 4;
    %do j=1 %to 7;
        %put %superq(tableb&i.modal&j);
    %end;
   %end;
%mend name_modal;
%name_modal();

結果は正しく表示されます。

余分なアンパサンドなしでマクロ変数名を受け入れるわけでは%superq(tableb&i.modal&j)ないことに注意してください。%superq(&&tableb&i.modal&j)superq

于 2012-05-03T20:20:40.373 に答える
1

コードを再作成できない(グローバルマクロがない)ため、すべてのサンプルデータの質問に答えるのは困難です。

[更新]マスクする必要のある文字を含むマクロを解決するのはより困難です。実行可能なコードを投稿すると、さらにヘルプが提供されます。

ここにマクロ引用の良いリンクがあります。

これには、さまざまな状況で使用するマクロマスキング関数の詳細を示す非常に優れた図があります。

%Strは、文字列に%または&が含まれていても、スペースが続く限り機能します。%NRSTRは、マクロ変数またはマクロ呼び出しとして解釈できる場合。一重引用符(')または一重引用符( ")の前にパーセント記号(%)を付けるか、BQUOTEまたはNRBQUOTE(文字列に&または%が含まれている場合)を使用できます。

これがスタートです[UPDATE]

%Macro Test(var=);
 %Put &var;
%Mend test;

%Test(Var=%str($100% BLO)) ;

%Test(Var=%str(100% COLOR)) ;
%Test(Var=%nrstr(100 %COLOR)) ;

%Test(Var=%str(AVON & RAGOBERT)) ;
%Test(Var=%nrstr(AVON &RAGOBERT)) ;

%Test(Var=%str(BALLANTINE%'S)) ;
%Test(Var=%bquote(BALLANTINE'S)) ;

%Test(Var=%str(L%'OREAL)) ;
%Test(Var=%bquote(L'OREAL)) ;

%Test(Var=%nrstr(AT&T)) ;
%Test(Var=%str(U-V-A)) ;
于 2012-05-03T18:43:45.490 に答える