Martin Reindl
Martin Reindl

Reputation: 1603

SAS CATX Error: Null Parameters for CATX are invalid

I am trying to concatenate some variables in SAS Enterprise guide.

I start with a SAS_table, which looks something like (note the empty column plums and the empty observation for pears:

id      farm         apples        pears           cherries          plums
1       'Munich'     'Granny'      'Williams'      'RedDelight'
2       'Amsterdam'  'PinkLady'                    'Scrumptious
3       'Moscow'     'Braeburn'    'Williams'      'RedDelight'     

Then I create global variables as follows:

%do i = 1 %to 3; 
    %global farm_&i., apples_&i., pears_&i., cherries_&i., plums_&i.;
%end; 

And I store the above table in the global variables as follows:

data _NULL_; 
    set SAS_table; 
    %do i = 1 %to 3; 
        if id = &i. then do; 
            call symput("farm_&i.", farm); 
            call symput("apples_&i.", apples); 
            call symput("pears_&i.", pears); 
            call symput("cherries_&i.", cherries); 
            call symput("plums_&i.", plums); 
        end; 
    %end;
run; 

All of the above seems to work smoothly. In a next step I want to the individual variables to get the following output (please note that empty values are just skipped - no extra delimiter (" :: ") is set for these cases):

concat_1:      Munich :: Granny :: Williams :: RedDelight
concat_2:      Amsterdam :: PinkLady :: Scrumptious
concat_3:      Moscow :: Braeburn :: Williams :: RedDelight

To do this, I use the following code:

data _NULL_; 
    %do i = 1 %to 3;
         call_symput("concat_&i",catx(" :: ", &&farm_&i., &&apples_&i.., &&pears_&i.., 
             &&cherries_&i.., &&plums_&i..));
    %end;
run; 

However, when I run this code I get the error:

ERROR 159-185: Null parameters for CATX are invalid.

My assumption here is that SAS is unhappy because some of the variables can be empty values. But how do I fix this? I've messed around loads and just can't seem to find a good answer.

Upvotes: 1

Views: 1217

Answers (1)

Tom
Tom

Reputation: 51611

It looks to me like your macro variables will have values like Munich in them. So the SAS code that your macro is generating needs to generate a string literal like "Munich" otherwise SAS will look for a variable with that name. This also explains the error about null values since without the quotes to make the null value into a string literal you end up with a CATX() call with adjacent delimiters.

data _NULL_; 
%do i = 1 %to 3;
  call_symput("concat_&i",catx(" :: ", "&&farm_&i.", "&&apples_&i.."
             , "&&pears_&i..", "&&cherries_&i..", "&&plums_&i.."))
  ;
%end;
run; 

You could instead generate the macro variables with the quotes, but they would probably be much less useful as macro variables in that form. So instead of changing the last call symput() statement you could change the earlier ones that make the macro variables. You could also remove the unneeded macro code from that step.

data _NULL_; 
  set SAS_table; 
  call symput(cats("farm_",id), quote(farm)); 
  call symput(cats("apples_",id), quote(apples)); 
  call symput(cats("pears_",id), quote(pears)); 
  call symput(cats("cherries_",id), quote(cherries)); 
  call symput(cats("plums_",id), quote(plums)); 
run; 

Upvotes: 1

Related Questions