It seems CATX will deal with missing characters properly, but when it converts the numeric to character it becomes a period which is no longer a 'missing' value. IMO this is not the expected behaviour though it does line up with the documentation.
The CATX function first copies item-1 to the result, omitting leading and trailing blanks. Then for each subsequent argument item-i, i=2, …, n, if item-i contains at least one non-blank character, then CATX appends delimiterand item-i to the result, omitting leading and trailing blanks from item-i. CATX does not insert the delimiter at the beginning or end of the result. Blank items do not produce delimiters at the beginning or end of the result, nor do blank items produce multiple consecutive delimiters.
If item is numeric, then its value is converted to a character string by using the BESTw. format. In this case, SAS does not write a note to the log. For more information, see The Basics.
Various solutions include:
1. Read in as character instead of numeric
2. Loop (see @Astounding solution).
3. Set option missing to a blank instead of ., see below.
options missing='';
data x;
input x1 x2 x3 x4 x5;
want = catx('-', of x1-x5);
datalines;
1 2 3 4 5
. 2 3 4 5
1 . 3 4 5
1 2 . 4 5
. . 3 4 .
. . . . 5
;
run;
options missing=.;
... View more