0

私はまだSAS特殊文字の扱いにこだわっています。

 %macro mFormat();
    %do i=1 %to &numVar. ;
        proc format library = work ;
            invalue $ inf&&nomVar&i..s
            %do j=1 %to &&numMod&i.;
                "%superq(tb&i.mod&j.)" = &j.
            %end;
            ;
        run;
        proc format library = work ;
            value f&&nomVar&i..s
            %do k=1 %to &&numMod&i.;
                &k. = "%superq(tb&i.mod&k.)"
            %end;
            ;
        run;
    %end;
%mend mFormat;
%mFormat();

ご覧のとおり、プログラムは各変数のフォーマットとインフォーマットを作成することを想定しています。私の唯一の問題は、変数名が次を含むブランドに解決されるときです

GOTAN-GOTAN
FRANCES-FRANCES
+&DECO- + DECO&
など..。

これらの名前は私をこのエラーに導きます

「エラー:この範囲が繰り返されているか、値が重複しています:」</ p>

SASにそれらの名前を強制的に読み取らせることができるといいのですが。または、おそらく、これは、これらの文字(&、%、-、'、 ")を含む変数のFORMATSおよびINFORMATSを生成するための最良のアプローチではありません。

4

2 に答える 2

1

あなたが提供したサンプルでは、​​ハイフンが問題だと思います。文字置換機能を使用して、ハイフン(またはその他の問題のある文字)をスペースやアンダースコアなどの他の文字に変換できる場合があります。

%Let Test=One-Two;
 %Put &test;
%Let Test=%sysfunc(translate(&test,%str(_),%str(-)));
 %Put &test;
于 2012-05-04T19:17:53.077 に答える
1

マクロは非常に多くのグローバルマクロ変数を使用しているため、問題を確認するのは困難です。このエラーメッセージは、マクロがPROCFORMATに重複する範囲を生成していることを示しています。完全なエラーメッセージは、どの範囲がエラーになっているのかを示しているはずです。それがあなたが見るすべてであるならば、私の推測では、あなたのマクロ変数の多くが空白に解決されると思います。

PROCFORMAT範囲を定義するときにハイペンを使用することに制限はありません。説明のために、この小さな例を作成しました。

proc format library = work ;
   invalue infs
     'GOTAN-GOTAN'     = 1
     'FRANCES-FRANCES' = 2
     '+&DECO-+DECO&'   = 3;
   value fs
     1 = 'GOTAN-GOTAN'
     2 = 'FRANCES-FRANCES'
     3 = '+&DECO-+DECO&';
run;
data a;
   test = 'FRANCES-FRANCES';
   in_test = input(test,infs.);
   put test= in_test= in_test= fs.;
run;

マクロの問題を解決するためのトリックを見つけるかもしれませんが、それを捨てて、PROC FORMATのCNTLINオプションを使用して、データセットを使用してカスタムフォーマットとインフォーマットを作成することをお勧めします。それは確かに物事を維持しやすくし、プロジェクトに役立つメタデータを作成するのにも役立つかもしれません。上記と同じフォーマットとインフォーマットを作成する簡単な例を次に示します。

data fmt_defs;
   length fmtname start label $32 type $1;

   fmtname = 'INFS';
   type = 'I';
   start = 'GOTAN-GOTAN';     label = '1'; output;
   start = 'FRANCES-FRANCES'; label = '2'; output;
   start = '+&DECO-+DECO&';   label = '3'; output;

   fmtname = 'FS';
   type = 'N';
   start = '1';  label='GOTAN-GOTAN';     output;
   start = '2';  label='FRANCES-FRANCES'; output;
   start = '3';  label='+&DECO-+DECO&';   output;
run;
proc format library = work cntLin=fmt_defs;
run;

PROC FORMATの詳細については、オンラインドキュメントを参照してください。

頑張って、ボブ

于 2012-05-06T19:22:38.210 に答える