Schwa
Schwa

Reputation: 139

Checking to see if a dataset exists

I've just finished the main macro for a project that I'm on. It generates a line to enter into another table. So, my next step is to write another macro that calls this one. One of the arguments for this next macro is the name of the dataset in which to insert this new observation, which leads to my question...

I'd like for my next macro to check and see if the named dataset exists. If so, it will insert the new calculated line into the dataset. If it dose not yet exist, I'd like to save the new line as a dataset with this name.

To get a little bit more concrete, let's suppose I have the macro %calculate_for(ARG1, ARG2, ARG3) that creates a single-observation dataset NEXT_LINE. I want to write a macro that does something like:

%macro do_for(ARG1, ARG2, ARG3, DATASET_NAME);

  %calculate_for(&ARG1, &ARG2, &ARG3)

  {if DATASET_NAME exists then do:}
  data &DATASET_NAME;
    set &DATASET_NAME
        NEXT_LINE;
    run;

  {if DATASET_NAME doesn't exist yet then do:}
  data &DATASET_NAME;
    set NEXT_LINE;
    run;
%mend;

How might I go about doing this in SAS?

Upvotes: 1

Views: 3498

Answers (1)

Richard
Richard

Reputation: 27508

The macro function %SYSFUNC can be used to invoke almost any DATA step function.

For example

%macro …;

  data &out;
    set
      %if %sysfunc (EXIST(&OUT,DATA)) %then %do;
      &OUT
      %end;
      NEXT_LINE;
    ;
  run;

%mend;

Likewise, the %SYSCALL routine can be used to invoke almost any CALL routine.

As @Reeza comments, for the specific coding case in your question, Proc APPEND could be the better choice. The pattern shown in your sample code would cause an entire rewrite of the base table.

Other coding patterns that do not rewrite the entire data set include

  • DATA Step : MODIFY statement with subsequent OUTPUT, REPLACE or REMOVE statements
  • Proc SQL : INSERT INTOSELECT … FROM

If you are doing a lot of development, perhaps don't recreate the wheel at every step. Look around for SAS macro libraries that have common utility features, one example Roland's SAS® Macros

Upvotes: 4

Related Questions