2012-05-03 12 views
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番目に渡すまで、すべてが正常に機能しています。例えば引用符が一致しないSAS

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

は、私は(グローバルマクロの欠落)あなたのコードを再作成することはできませんので、すべてあなたのサンプルデータのための質問に答えるのは難しいですあなた

答えて

2

数回試した後、私は%superqは、この問題を解決することができ見つけるマクロで特殊文字の取り扱い面倒である。このpageは引用マクロ上のいくつかの有用なヒントを提供し

私は簡素化。。。きみの ここにコードする

更新:ダブルループのケースにします。

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は、余分なアンパサンドなしでマクロ変数名を受け入れることに注意してください。

+0

奇妙なことに、これは動作します。私は%superqを使用したことを思い出したので言っていますが、まだいくつかのエラーがあります。私は明日の仕事で再びプログラムをデバッグしようとしたときにフィードバックをお送りします。 – afiqjohari

+0

いいです...%superqが&jを解決したことに私は驚いています。 –

+0

私はちょうどプログラムをデバッグする必要があります。プログラムはモダリティ(j = 1〜numMod)だけをループするとうまくいった。今のところ%superq()はその仕事をすることができます。しかし、これに別のループを追加しようとすると、%superv()は%&& tableb&i.modal&jの解釈に失敗します。正しく – afiqjohari

1

ありがとうございます。

[UPDATE]マスクする必要のある文字を解決するマクロを取得することは難しくなります。実行可能なコードを掲載し、より多くのヘルプを提供することができます。

Hereは、マクロクォートのための良いリンクです。

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

%文字列に%または&が含まれていても、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)) ; 
+0

ありがとうございます。 私は現在仕事をしていないので、コードを再作成するために必要なグローバルマクロを提供することは難しいでしょう。しかし、私の場合は、L'OREALからL%OREALのような変数モダリティの名前を変更できませんでした。 – afiqjohari

関連する問題