Skip to main Content

Incrementing Character Values

Incrementing numeric values can be easily achieved using SAS software, but what about incrementing character values?

Let's consider a scenario where we have our starting code AA and we would like to increment this value by a one character each time, so therefore the next code is AB, then AC etc to the value of ZZ.

When incrementing numeric values we can simply add 1 to the value, similarly we can use the same method with character values.

The steps we need to take are:

• Find the ASCII equivalent value for our last character value in our code using the RANK function;

• Find the ASCII equivalent value for our minimum and maximum values so 'A' and 'Z' which are 65 and 90 respectively;

• Increment the ASCII equivalent value by 1 for our code;

• Place the new ASCII value back into a character value using the BYTE function.

The RANK function is used to find the position of a character in the ASCII collating sequence.
Syntax is

             RANK(<character string>)

The BYTE function will return one character in the ASCII collating sequence.
Syntax is

             BYTE(n)

where n ranges from 0 to 255.

Below is a simple example which starts with the code AW and will then increment the current code value by the next character value for duration of 10 iterations.

data work.code(keep=code);
  input code $;
  output;
  do i=1 to 10;
    *Find the ASCII value for the second character value;
    last_char=rank(substr(code,2,1))+1;
    *If the new last character is higher than Z then set the
    letter to A and increment the first character;
    if last_char > 90 then do;
      last_char=65;
      *Find the ASCII value for the first character value;
      first_char=rank(substr(code,1,1))+1;
      *If the existing code is ZZ then error;
      if first_char > 90 then put 'ERROR: No More Unique Codes';
      *Replace the first character with new value;
      else substr(code,1,1)=byte(first_char);
    end;
    *Replace the second character with new value;
    substr(code,2,1)=byte(last_char);
    output;
  end;
datalines;
AW
run;
 
proc print data=new_codes;
run;

 

Output Window:

 
 Obs    code
  1     AW
  2     AX
  3     AY
  4     AZ
  5     BA
  6     BB
  7     BC
  8     BD
  9     BE
  10    BF
  11    BG