/*------------------------------------------------------------*
* NAME: %MAKETBL *
* PURPOSE: %MAKETBL is a SAS macro that generates a *
* translation table for use in the SORTSEQ= *
* option of PROC SORT. *
* AUTHORS: Arjen Raateland - FEA, Helsinki, Finland *
* Biff Beers - SAS Institute, Cary, *
* North Carolina, USA *
* USAGE: %maketbl(charlist, tblename) ; *
* PARAMETERS: *
* - CHARLIST: a list of characters in the desired sorting *
* order. SAS Macro quoting rules apply. For *
* example, if the characters ("), ('), or (,) *
* are to be listed, they must be enclosed in *
* the macro function %BQUOTE. No more than 200 *
* characters can be listed. *
* - TBLENAME: the name of the translation table to be *
* generated. *
* NOTES: *
* - This macro can be used independently of the *
* underlying character set. However, the *
* underlying character set is assumed to be a *
* single-byte character set. *
* - Characters that are listed in CHARLIST should *
* appear in the list only once, but not every *
* character in the underlying character set must *
* be listed. *
* - Characters that are NOT listed in CHARLIST and *
* that occur in the underlying character set *
* before all the characters that are listed *
* remain before those characters in the *
* resulting sorting sequence. *
* - Other characters not listed in CHARLIST appear *
* after all the listed characters in the *
* resulting sorting sequence. *
*------------------------------------------------------------*/
%macro maketbl(charlist, tblename);
/*----------------------------------------------------------*
* For each character listed in CHARLIST, this DATA step *
* records the position of the character in the underlying *
* character set and the desired sorting weight of the *
* character based on its relative position in the list. *
*----------------------------------------------------------*/
data listed(keep=pos weight);
charlist="&charlist";
len=length(charlist);
minpos=256;
do i=1 to len;
char=substr(charlist,i,1);
pos=rank(char);
if pos