2012-05-04 16 views
0

私はまだSASの特殊文字処理に悩まされています。引用符SAS(+)PROC FORMAT値| invalue

%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(); 

ご覧のとおり、プログラムは各変数の形式と情報を作成することを想定しています。変数名は
+ &デコ+​​ DECO &
などを

GOTAN-GOTAN
FRANCES-FRANCESが含まれているブランドに解決するとき私の唯一の問題は、

これらの名前はこれに私をリード...ですエラー

“ERROR: This range is repeated, or values overlap:”

私はSASにこれらの名前を読み取らせてもらいたいと思います。あるいは、これは、これらの文字(&、%、 - 、 '、 ")を含む変数に対してFORMATSとINFORMATSを生成する最良の方法ではありません。

+0

は実際に私がここに特殊文字を扱うに間違った表示されません。二重引用符で十分です。あなたのコードをテストするために少し削除しました(http://pastebin.com/vXsE8KWw)。その結果、数字8は正しく「ゴタンゴタン」に翻訳されます。処理中にエラーは発生しません。あなたが 'proc format'の中でdoループを使うのを混乱させる一つのことがあります。私はそれが有効かどうかわからない。 'proc format 'の値のステートメントは、マクロによって生成することができます。私が間違った方法で理解すれば私を修正してください。 –

答えて

1

をマクロは非常に多くのグローバルマクロ変数を使用しているので、それは問題を見るのは難しいですそのエラーメッセージは、マクロがPROC FORMATに重複した範囲を生成していることを示します。エラーメッセージの中には、エラーの範囲が示されます。私の推測では、あなたのマクロ変数の多くが空白に解決されると思います。

PROC FORMAT範囲を定義するときにハイフンを使用することに制限はありません。私が説明するために、この小さな例を作った:

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オプションを使用したいですカスタムフォーマットとインフォーマットを作成します。それは確実に物事を維持しやすくし、あなたのプロジェクトに有用なメタデータを作成するのにも役立ちます。ここでは上記と同じ形式とinformatを作成するための簡単な例です:

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フォーマットに関するより多くの情報を見つけることができます。

幸運、 ボブ

+0

ありがとうございます。私は、informatを生成し、cntLinでフォーマットするプログラムを作成しました。 – afiqjohari

1

私はあなたが提供したサンプルで問題があると思います。あなたは、スペースまたはアンダースコアのような何か他のものにTRANSLATEハイフン(または他の問題の文字)に文字置換機能を使用することができます。

%Let Test=One-Two; 
%Put &test; 
%Let Test=%sysfunc(translate(&test,%str(_),%str(-))); 
%Put &test; 
+0

ありがとうございましたCarolinaJay65。あなたは私の以前の質問にも答えたことを覚えています。ハイフンがここで問題を引き起こしているのは事実です。しかし、残念ながら、今のところ、私は文字の名前に関しては何も変更することはできません。 **ハイフン**を** _ **に変更すると、FORMATにFRANCES_FRANCESが格納され、FRANCES_FRANCESではなくFRANCES_FRANCESを含むテーブルにFORMATを適用するときに別の問題が発生する可能性があります。 – afiqjohari

+0

私はSASがPROC FORMATの**ハイフン**を無視できるような方法を探しています。 – afiqjohari

+0

フォーマットを変数にプットしようとすると、その変数値を元の値に戻すことができます。書式/情報に使用するのと同じ式を使用しますが、その逆です。 GOTAN-GOTANには1つのフォーマット、FRANCES-FRANCESには2つのフォーマットなどのフォーマットを使用していますか? –