次のマクロでは、%QSCAN関数を使用して、SYSBUFFR(
自動マクロ変数で説明されています)の値に含まれる項目を、別のマクロ変数の値として割り当てています。コメント内の番号は、マクロコードの後にある各説明に対応しています。
%macro splitit;
%put What character separates the values?; 1
%input;
%let s=%bquote(&sysbuffr); 2
%put Enter three values.;
%input;
%local i;
%do i=1 %to 3; 3
%global x&i;
%let x&i=%qscan(%superq(sysbuffr),&i,&s);
4
%end;
%mend splitit;
%splitit
What character separates the values?
#
Enter three values.
Fischer Books#Smith&Sons#Sarah's Sweet Shoppe
5
-
この質問は、入力する値に現れない、%QSCAN関数が使用する区切り文字の入力を要求しています。
-
%BQUOTE関数を使用してSYSBUFFRの値をマスクすることで、必要な場合、引用符またはかっこを区切り文字として選択できるようにしています。
-
反復する%DOループによってSYSBUFFRのセグメントごとにグローバルマクロ変数を作成し、その変数にセグメントの値を割り当てます。
-
%QSCAN関数の第1引数に渡されるSYSBUFFRの値を、%SUPERQ関数によってマスクしています。これによって、SYSBUFFRの値に対するあらゆる置換が抑制されます。
-
%QSCAN関数によって、マクロクォーティングされたSYSBUFFRの値のセグメントが返されます。したがって、
Sarah's Sweet Shoppe
に含まれる一致しない引用符、と
Smith&Sons
に含まれる&
nameのパターンは、問題を引き起こしません。