2017-07-20 3 views
3

配列に文字のシーケンスを定義するためにSASに略記されていますか?SAS - 文字の配列を定義する

多くの言語は簡単にそうするための仕組みを持っていますが、私はそれについてのリファレンスを見つけることができませんが、SASもそう思っています。

例えば、RIに、私は現在、明示的に文字をリストアップするのです、Pythonで

> x <- letters[1:4] 
> x 
[1] "a" "b" "c" "d" 

は、一つの方法は、SASに

>>> import string 
>>> list(string.ascii_lowercase[:4]) 
['a', 'b', 'c', 'd'] 

で行うことができます

data _null_; 
    array letters (4) $ _temporary_ ('a', 'b', 'c', 'd'); 
    do i = 1 to hbound(letters); 
    put letters(i); 
    end; 
run; 

答えて

2

COLLATE()を使用して、1バイト文字列を生成できます。必要な文字ブロックの先頭のASCIIコードがわからない場合は、RANK()機能を使用してください。

だから、「a」から始めるのは4文字だけです。このようにすることができます。

length str $4 ; 
    str = collate(rank('a')); 

またはあなたはまた、あなたが望むどのように多くの文字を指定するCOLLATE()に、オプションの二番目のパラメータを使用することができます。

length str $4 ; 
    str = collate(rank('a'),rank('a')+vlength(str)-1); 

「配列」は必要ありません。変数を使用するだけです。

data _null_; 
    length str $4 ; 
    str = collate(rank('a')); 
    do i=1 to vlength(str); 
    ch = char(str,i); 
    put i= ch= :$quote. ; 
    end; 
run; 

結果:

i=1 ch="a" 
i=2 ch="b" 
i=3 ch="c" 
i=4 ch="d" 
+0

おもしろいです!あなたは ':quote.'を説明することができますか? 'ch'の値を引用符で囲んでいることがわかります。それはフォーマットですか?コロンは式の一部ですか、それとも多面的なコロン演算子ですか? –

+0

これは単に出力に引用符を追加して、変数に実際に入っている値を明確にします。これは文字変数であるため、 ':$ quote.'でなければなりません。 ':'は値と引用符をトリムするでしょうが、これはおそらくこのケースでは必要ないでしょうが、私はちょうど習慣から除外しました。 – Tom

4

私が気づいているわけではありませんが、そうするためにマクロを書くのは簡単です。

%macro letter_sequence(start=1,end=, lower=1); 
    %local i addon; 
    %if &lower=1 %then %let addon=96; 
    %else %let addon=64; 
    %do i = &start+&addon. %to &end.+&addon.; 
    "%sysfunc(byte(&i.))" 
    %end; 
%mend letter_sequence; 

data test; 
    array x[4] $ (%letter_sequence(end=4)); 
    put x[2]=; 
run; 
0

あなたは(そのASCII値の文字を変換)rank機能と(他の方法をバックに変換)byte機能を組み合わせて使用​​することができます。

data _null_; 
length seq $51; /* define seq as character variable */ 
do i = rank('a') to rank('d'); /* loop through ascii values of required letters */ 
call catx(' ',seq,byte(i)); /* concatenate letters */ 
end; 
put seq; /* print final output */ 
run; 
2

別のオプションcollate機能と日常call pokelong使用することです:これは、個々の変数の値を割り当てるためのすべての通常のメカニズムをバイパスし、SASで使用されるデフォルトのメモリレイアウトを利用しています

/*Upper case*/ 
data _null_; 
    array a[26] $1; 
    call pokelong(collate(65,65+25),addrlong(a1),26); 
    put _All_; 
run; 

/*Lower case*/ 
data _null_; 
    array a[26] $1; 
    call pokelong(collate(97,97+25),addrlong(a1),26); 
    put _All_; 
run; 

を文字配列の場合は、アルファベット全体を最初の要素のアドレスから始めてコピーします。

N.B.一部のロックダウンされたSAS環境では、call pokelongが利用できない場合があります。 SAS大学版。また、一部のプラットフォームでSAS 9.1.3以前のテンポラリアレイでは正しく動作しないことがあります。

これは、文字をハードコードしたり、何らかのループを書くことなく、SASでこれを行う唯一の方法だと思います。

関連する問題