前のページ|次のページ

%STR関数と%NRSTR関数

マクロのコンパイル時に、定数テキストに含まれている特殊文字やニーモニック演算子をマスクします。

種類: マクロクォーティング関数
参照項目: %NRQUOTE関数

構文

%STR(character-string)
%NRSTR (character-string)

詳細

%STR関数および%NRSTR関数は、マクロまたはマクロ言語ステートメントのコンパイル時に、特定の文字をマスクします。これらの関数は、次に示す特殊文字とニーモニック演算子をマスクします。
+ − * / < > = ¬ ^ ~ ; ,  # blank
AND OR NOT EQ NE LE LT GE GT IN
また、これらの関数は、次の文字がペアで検出された場合や、次の文字がペアマッチなしで検出され、その文字が先行する%によりマークされている場合に、その文字をマスクします。
' " ( )
さらに、%NRSTR関数は次の文字もマスクします。
& %
%STR関数と%NSTR関数における引数の使用
引数
使用
引用符の前にあるパーセント記号、%'や%”など
引用符付きのパーセント記号
例:%let percent=%str(Jim%'s office);
丸かっこの前にあるパーセント記号、%(や%)など
2つのパーセント記号(%%)
例:%let x=%str(20%%);
コメント記号付きの文字列、/* や -->など
各文字ごとに%STR関数を適用
例:%str(/) %str(*) comment-text %str(*)%str(/)
%STR関数は、次のものを含んでいる文字列を処理する場合に便利です。
  • マクロプログラムステートメントの一部としてではなく、テキストとして扱う必要のあるセミコロン
  • 意味のある空白
  • ペアとしてマッチしない引用符や丸かっこ
ネストした%STR関数や%QUOTE関数の内部に、同じ引数を配置するのは冗長です。次の例では、マクロのコンパイル時に%STR関数によりマスクされた引数が、マクロの実行時にもマスクされたままになることを示しています。したがって、この例で使用されている%QUOTE関数には効果がありません。
%quote(%str(argument))
注意:
パラメータ値のリストを含む他のマクロ関数やマクロ呼び出しを、%STR関数の引数に指定しないでください。
%STR関数はマッチしない丸かっこをマスクするため、マクロプロセッサは、関数の引数やマクロ呼び出しのパラメータ値を認識できなくなります。
SASマクロ言語におけるクォーティングの詳細については、マクロクォーティングを参照してください。
注: マクロクォーティング関数の最大ネストレベルは10です。

比較

  • すべてのマクロクォーティング関数の中で、コンパイル時に有効となるのは%NRSTR関数と%STR関数のみです。それ以外のマクロクォーティング関数は、マクロの実行時に有効となります。
  • %STR関数と%NRSTR関数は、それぞれ%QUOTE関数と%NRQUOTE関数がマスクするのと同じ項目をマスクします。ただし、%QUOTE関数と%NRQUOTE関数はマクロの実行時に有効となります。
  • マクロ式を置換した結果、マスクが必要な項目が生成される場合、%STR関数や%NRSTR関数ではなく、%BQUOTE関数や%NRBQUOTE関数を使用します。

例1: 先頭の空白の保持

次の例は、マクロ変数TIMEの値に先頭の空白を含めるようにします。
%let time=%str(   now);
%put Text followed by the value of time:&time;
この例を実行すると、次の行がSASログに書き込まれます。
Text followed by the value of time:   now

例2: 空白を保護してテキストとしてコンパイルされるようにする

次の例では、%QSCAN関数がワード間の区切り文字として空白を使用するよう指定します。
%macro words(string);
   %local count word;
   %let count=1;
   %let word=%qscan(&string,&count,%str( ));
   %do %while(&word ne);
      %let count=%eval(&count+1);
      %let word=%qscan(&string,&count,%str( ));
   %end;
   %let count=%eval(&count-1);
   %put The string contains &count words.;
%mend words;
%words(This is a very long string)
このプログラムを実行すると、SASログに次のメッセージが書き込まれます。
The string contains 6 words.

例3: マクロ参照を含む値のクォーティング

マクロREVRSは、マクロTESTにより生成された文字列を逆順にします。%PUTステートメント内の%NRSTR関数は、文字列%test&testがマクロ呼び出しとして解釈されるのではなく、テキストとしてコンパイルされるように同文字列を保護します。
%macro revrs(string);
   %local nstring;
   %do i=%length(&string) %to 1 %by -1;
      %let nstring=&nstring%qsubstr(&string,&i,1);
   %end;
 &nstring
%mend revrs;
%macro test;
   Two words
%mend test;
%put %nrstr(%test%test) - %revrs(%test%test);
このプログラムを実行すると、次の行がSAログに出力されます。
1          %macro revrs(string); 2             %local nstring; 3             %do i=%length(&string) %to 1 %by -1; 4                %let nstring=&nstring%qsubstr(&string,&i,1); 5             %end;&nstring 6          %mend revrs; 7 8          %macro test; 9             Two words 10         %mend test; 11 12         %put %nrstr(%test%test) - %revrs(%test%test); %test%test - sdrow owTsdrow owT NOTE:SAS Institute Inc., SAS Campus Drive, Cary, NC USA 27513-2414 NOTE:The SAS System used: real time           0.28 seconds cpu time            0.12 seconds
前のページ|次のページ|ページの先頭へ