2017-07-20 3 views
3

Gibt es in SAS eine Abkürzung für die Definition einer Buchstabenfolge in einem Array?SAS - Array von Buchstaben definieren

Viele Sprachen besitzen einen einfachen Mechanismus, und ich kann mir vorstellen, dass SAS das auch tut, obwohl ich keine Referenz dafür finden kann.

Zum Beispiel könnte in RI tun

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

In Python, ein Weg

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

In SAS, ich zur Zeit die Buchstaben explizit aufzulisten habe,

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

Antwort

2

Sie können COLLATE() verwenden, um eine Zeichenfolge aus einzelnen Bytezeichen zu generieren. Wenn Sie den ASCII-Code für den Start des gewünschten Zeichenblocks nicht kennen, verwenden Sie die Funktion RANK().

Wenn Sie also nur vier Zeichen von 'a' starten möchten, können Sie dies auf diese Weise tun.

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

Oder Sie könnten auch den optionalen zweiten Parameter zu COLLATE() verwenden, um festzulegen, wie viele Zeichen, die Sie wollen.

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

Es ist kein "Array" erforderlich, sondern nur eine Variable.

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; 

Ergebnis:

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

Interessant! Können Sie das Zitat erklären? Ich sehe, dass es Zitate um den Wert von "ch" platziert. Ist es ein Format? Ist der Dickdarm Teil des Ausdrucks oder handelt es sich um den vielschichtigen Doppelpunkt-Operator? –

+0

Das ist nur die Anführungszeichen in der Ausgabe hinzufügen, um klarer zu machen, welche Werte tatsächlich in der Variablen sind. Es sollte ': $ quote' sein, da es sich um eine Zeichenvariable handelt. Das ':' wird dazu führen, dass es die Werte und das Zitat kürzt, was für diesen Fall wahrscheinlich nicht notwendig ist, aber ich habe es einfach aus Gewohnheit eingefügt. – Tom

4

Nicht, dass ich mir dessen bewusst bin, aber es ist trivial, ein Makro dafür zu schreiben.

%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

Sie eine Kombination der rank Funktion verwenden können (was ein Zeichen seines ASCII-Wert konvertiert) und die byte Funktion (die die andere Art und Weise wandelt zurück).

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

Eine weitere Option ist die collate Funktion und die call pokelong Routine zu verwenden:

/*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; 

Dies umgeht alle üblichen Mechanismen für die Zuweisung von Werten für die einzelnen Variablen und nutzt die Standard-Speicher-Layout von SAS verwendet Für Zeichenarrays, Kopieren des gesamten Alphabets auf einmal, beginnend bei der Adresse für das erste Element.

N.B. call pokelong ist möglicherweise in einigen gesperrten SAS-Umgebungen nicht verfügbar, z. SAS Universitätsausgabe. Dies funktioniert möglicherweise auch nicht ordnungsgemäß mit temporären Arrays in SAS 9.1.3 oder früher auf einigen Plattformen.

Ich denke, das ist der einzige Weg, dies in SAS zu tun, ohne entweder Ihre Buchstaben hart zu codieren oder eine Art Schleife zu schreiben.