前のページ|次のページ

%SCAN関数と%QSCAN関数

文字列内の位置により指定されるワードを検索します。

種類: マクロ関数
参照項目: %NRBQUOTE関数および %STR関数と%NRSTR関数
Macro Functions in UNIX Environments (UNIX版SAS)
Macro Functions (z/OS版SAS)

構文

%SCAN(argument, n<,charlist <,modifiers> >)
%QSCAN(argument, n<,charlist <,modifiers> >)

必須引数

argument

文字列またはテキスト式を指定します。argumentが次に示すような特殊文字やニーモニック演算子を含んでいる場合、%QSCANを使用します。argumentがカンマを含んでいる場合、%BQUOTE(argument)のように、クォーティング関数を使用してargumentを囲みます。

n

この関数が返すワードの位置を表す整数、またはそのような整数を生成するテキスト式です(暗黙の%EVALは、n個の数値プロパティを提供します)。nargument内にあるワード数よりも大きい場合、この関数はヌル文字列を返します。

注: バージョン8以降のSASシステムでは、nが負数である場合、%SCAN関数は文字列を検査し、その文字列の末尾にあるワードから逆方向に検索を実施します。

charlist

文字のリストを初期化する文字式を指定します(省略可能)。このリストは、単語を区切る区切り文字として使用する文字を決定します。次の規則が適用されます。

  • デフォルトでは、charlist内にあるすべての文字が区切り文字として使用されます。
  • 引数modifierにモディファイヤKを指定すると、charlist内に存在しないすべての文字が区切り文字として使用されます。
ヒント charlistに文字を追加するには、次に示す各種のモディファイヤを使用します。

modifier

%SCAN関数の動作を変更する非空白文字を含む文字定数、変数、式を指定します。空白は無視されます。次の文字を修飾子として使用できます。

aまたはA アルファベット文字を文字リストに追加します。
bまたはB 引数countの符号にかかわらず、左から右へではなく、右から左にスキャンを実行します。
cまたはC 制御文字を文字リストに追加します。
dまたはD 数字を文字リストに追加します。
fまたはF 下線と英字(VALIDVARNAME=V7オプション使用時のSAS変数名で有効な先頭文字)を文字リストに追加します。
gまたはG グラフィック文字を文字リストに追加します。グラフィック文字とは、紙の上にイメージとして印刷される文字のことです。
hまたはH 水平タブを文字リストに追加します。
iまたはI 大文字小文字を無視します。
kまたはK 文字リストに含まれていないすべての文字が区切り文字として扱われるようにします。つまり、モディファイヤKを指定すると、文字リストに含まれている文字が、区切り文字として省略されるのではなく、戻り値内に保持されるようになります。Kを指定しない場合、文字リスト内のすべての文字が区切り文字として扱われます。
lまたはL 小文字を文字リストに追加します。
mまたはM 複数の連続する区切り文字、および引数string の先頭または末尾にある区切り文字が、長さゼロのワードを意味することを指定します。モディファイヤMを指定しない場合、複数の連続する区切り文字は1つの区切り文字として扱われ、引数stringの先頭または末尾にある区切り文字は無視されます。
nまたはN 数字、下線、英字(VALIDVARNAME=V7オプション使用時のSAS変数名に表示される文字)を文字リストに追加します。
oまたはO 引数charlistおよび引数modifierを、%SCAN関数が呼び出されるたびに処理するのではなく、一度だけ処理します。DATAステップ(WHERE句を除く)またはSQLプロシジャでモディファイヤOを使用すると、引数charlistおよびmodifierが変化しないようなループで%SCAN関数を呼び出す場合、同関数の処理が高速になります。モディファイヤOは、ユーザーが作成するSASプログラム内の%SCAN関数の各インスタンスに対して個別に適用されます。モディファイヤOは、%SCAN関数のすべてのインスタンスで同じ区切り文字やモディファイヤが使われるようにするものではありません。
pまたはP 句読点を文字リストに追加します。
qまたはQ 引用符で囲まれた部分文字列内にある区切り文字を無視します。引数stringの値に一致しない引用符が含まれている場合、左から右にスキャンした場合と右から左にスキャンした場合とでは異なるワードが生成されます。
rまたはR %SCAN関数が返すワードから、先頭または末尾にある空白を削除します。モディファイヤQおよびRの両方を指定すると、%SCAN関数はまずワードの先頭または末尾にある空白を削除します。モディファイヤQおよびRの両方を指定すると、%SCAN関数はまずワードの先頭または末尾にある空白を削除します。続いて、同ワードが引用符で始まる場合、%SCAN関数は引用符の1ペアを同ワードから削除します。
sまたはS スペース類(空白、水平タブ、垂直タブ、復帰、改行、改ページ)を文字リストに追加します。
tまたはT 引数string および 引数charlist の末尾にある空白を削除します。どちらか一方の引数だけから末尾の空白を削除したい場合、モディファイヤT付きの%SCAN関数ではなく、TRIM関数を使用してください。
uまたはU 大文字を文字リストに追加します。
wまたはW 印刷可能文字を文字リストに追加します。
xまたはX 16進文字を文字リストに追加します。
ヒント 引数modifierが文字定数である場合、それを引用符で囲む必要があります。一組の引用符で複数の修飾子を指定します。引数modifierには、文字変数や文字式も指定できます。

詳細

%SCAN関数と%QSCAN関数は、argumentを検索し、そのn番目のワードを返します。ワードとは、区切り文字(複数可)によって区切られた文字(複数可)のことです。
%SCAN関数は、引数がそれまでマクロクォーティング関数によりマスクされていた場合であっても、同関数が返す結果内で特殊文字やニーモニック演算子をマスクしません。%QSCAN関数は、同関数が返す結果内で次の特殊文字とニーモニック演算子をマスクします。
& % ' " ( ) + − * / < > = ¬ ^ ~ ; , # blank
AND OR NOT EQ NE LE LT GE GT IN
“区切り文字”および“単語”の定義
区切り文字とは、単語を区切るために使用される複数の文字のどれかです。区切り文字はcharlist引数とmodifier引数で指定できます。
Q修飾子を指定すると、引用符で囲まれた部分文字列内の区切り文字は無視されます。
%SCAN関数では、ワードとは、次に示す条件をすべて満たしている部分文字列を指します。
  • 左側が区切り文字または文字列の先頭で境界設定されている
  • 右側が区切り文字または文字列の末尾で境界設定されている
  • 区切り文字を含まない
文字列の先頭または末尾に区切り文字がある場合、または文字列に2つ以上の連続する区切り文字が含まれている場合、単語の長さがゼロになることがあります。ただし、モディファイヤMを指定しない場合、%SCAN関数は、長さがゼロであるワードを無視します。
ASCII環境とEBCDIC環境でデフォルトの区切り文字を使用する
2つの引数のみを持つ%SCAN関数を使用する場合、デフォルトの区切り文字は、お使いのコンピュータがASCIIとEBCDICのどちらをコード化文字セットとして使用しているかによって異なります。
  • お使いのコンピュータがASCII文字を使用している場合、デフォルトの区切り文字は次のようになります。
    空白 !$ % & ( ) * + , - ./ ; < ^¦
    文字^を含まないASCII環境では、%SCAN関数は代わりに文字~を使用します。
  • お使いのコンピュータがEBCDIC文字を使用している場合、デフォルトの区切り文字は次のようになります。
    空白 !$ % & ( ) * + , - ./ ; < ¬ | ¢¦
区切り文字としていかなる文字も指定せずに引数modifierを使用した場合、使用できる区切り文字は、引数modifierにより定義された区切り文字のみになります。この場合、ASCII環境とEBCDIC環境のデフォルトの区切り文字のリストは使用されません。つまり、モディファイヤは、引数charlistに指定された区切り文字のリストに文字を追加します。修飾子は、デフォルトの修飾子のリストには追加しません。
モディファイヤMを伴う%SCAN関数の使用
M修飾子を指定すると、文字列内の単語数は文字列内の区切り文字数に1を足した数になります。ただし、Q修飾子を指定すると、引用符内の区切り文字は無視されます。
モディファイヤMを指定すると、次の条件のいずれかがtrueである場合、%SCAN関数は長さがゼロのワードを返します。
  • 文字列の先頭が区切り文字であり、ユーザーが最初のワードを要求した場合
  • 文字列の末尾が区切り文字であり、ユーザーが最後のワードを要求した場合
  • 文字列が2つの連続する区切り文字を含んでおり、ユーザーがこれら2つの区切り文字間にあるワードを要求した場合
モディファイヤMを伴わない%SCAN関数の使用
M修飾子を指定しない場合、文字列内の単語数は連続する非区切り文字の最大部分文字列数になります。ただし、Q修飾子を指定すると、引用符内の区切り文字は無視されます。
モディファイヤMを指定しない場合、%SCAN関数は次のように動作します。
  • 文字列の先頭または末尾の区切り文字を無視する
  • 2つ以上の連続する区切り文字を単一の区切り文字として扱う
文字列に区切り文字のみが含まれている場合、または文字列内のワード数の絶対値よりも大きいカウント数を指定した場合、%SCAN関数は次のいずれかを返します。
  • DATAステップから%SCAN関数を呼び出した場合、単一の空白
  • マクロプロセッサから%SCAN関数を呼び出した場合、長さがゼロの文字列
ヌル引数の使用
%SCAN引数では、文字引数をヌルにできます。ヌル引数は長さがゼロの文字列として扱われます。数値引数はヌルにできません。

比較

%QSCAN関数は、%NRBQUOTE関数と同じ文字をマスクします。

例: %SCAN関数と%QSCAN関数のアクションの比較

次の例は、%SCAN関数と%QSCAN関数のアクションを比較するものです。
%macro a;
   aaaaaa
%mend a;
%macro b;
   bbbbbb
%mend b;
%macro c;
   cccccc
%mend c;
%let x=%nrstr(%a*%b*%c);
%put X: &x;
%put The third word in X, with SCAN: %scan(&x,3,*);
%put The third word in X, with QSCAN: %qscan(&x,3,*);
前述の%PUTステートメントは、次の行をSASログに書き込みます。
X: %a*%b*%c
The third word in X, with SCAN: cccccc
The third word in X, with QSCAN: %c
前のページ|次のページ|ページの先頭へ