BookmarkSubscribeRSS Feed
ari3170
Calcite | Level 5

I would like to get help to trasform this code in macro fuction:

Data my;
Set table;
Page1=scan(file1, -1, ',');
Page2=scan(file2, -1, ',');
Page3=scan(file3, -1, ',');
Run;

Thanks.

My macro is finished with error 68-185: the function file is unknown, or cannot be accessed

%macro name;
Data my;
Set table;
Array file[3] $50 file1-file3;
%do i=1 %to 3;
Page(&i)=%scan(file(&i),-1,',');
%end;
%mend;
%name;

Is there another way?

7 REPLIES 7
PaigeMiller
Diamond | Level 26

I think you can do the whole thing with ARRAYs, a macro is not needed here.

 

Data my;
    set table;
    array file $ 50 file1-file3;
    array page page1-page3; /* You may want to specify a length here too */
    do i=1 to 3;
        page[i]=scan(file[i],-1,',');
    end;
    drop i;
run;

 

 

By the way, in the future, if you are having macro errors, turn on the macro debugging options by running this command 

 

options mprint symbolgen;

 

and then run the macro again. The log will be easier to debug. If you still can't figure out what is wrong, then please SHOW US the log (the entire log for the macro, every single line, every single character, with nothing chopped out). Copy the log as text and paste it into the window that appears when you click on the </> icon. This is mandatory when showing us logs.

PaigeMiller_0-1663012019648.png

--
Paige Miller
ballardw
Super User

@ari3170 wrote:

I would like to get help to trasform this code in macro fuction:

Data my;
Set table;
Page1=scan(file1, -1, ',');
Page2=scan(file2, -1, ',');
Page3=scan(file3, -1, ',');
Run;

Thanks.

My macro is finished with error 68-185: the function file is unknown, or cannot be accessed

%macro name;
Data my;
Set table;
Array file[3] $50 file1-file3;
%do i=1 %to 3;
Page(&i)=%scan(file(&i),-1,',');
%end;
%mend;
%name;

Is there another way?


If you want to use a function with the values of data step variables then you do not use the macro function. The Macro code generates other code, not manipulates values of variables in data sets. Also do you thing this would be valid syntax:

Page(1) = scan(File(i),-1,',');

You do not define an array Page, so Page(<any thing>) is going to generate either an undefined function or array reference

error.

If you want to create/use data step variable Page1 then the syntax to use the macro variable &i would be : Page&i

But as @PaigeMiller says, an array solution would be superior.

 

Note: you will get more information from macro errors if you set: Options mprint; prior to running the macro. Mprint show the generated statements from the macro processor. The error messages would appear in proximity to that generated statement in the log so you could see which particular bit is the problem.

Quentin
Super User

Agree with others who have said that you don't need macros for this.

 

But if you are learning the macro language, it's helpful to see where your code went wrong.  

 

In this line:

Page(&i)=%scan(file(&i),-1,',');

You don't use parentheses around macro variable references.  And you want to use the SCAN data step function, not the %SCAN macro function.  You can try changing it to:

Page&i=scan(file&i,-1,',');

 

Below macro will work, but the non-macro array approach is better and clearer.

options mprint ;

%macro name();
  %local i ;

  data my2;
    file1='foo,bar' ;
    file2='monday,tuesday' ;
    file3='mon,dad' ;

    %do i=1 %to 3;
      Page&i=scan(file&i,-1,',');
    %end;
  run;

%mend;
%name()
BASUG is hosting free webinars Next up: Mark Keintz presenting History Carried Forward, Future Carried Back: Mixing Time Series of Differing Frequencies on May 8. Register now at the Boston Area SAS Users Group event page: https://www.basug.org/events.
PaigeMiller
Diamond | Level 26

@Quentin wrote:

 

Page(&i)=%scan(file(&i),-1,',');

You don't use parentheses around macro variable references.  And you want to use the SCAN data step function, not the %SCAN macro function.  You can try changing it to:

Page&i=scan(file&i,-1,',');

I'm sure @Quentin knows this, but to extend the explanation for the benefit of @ari3170 :

 

The reason for this (which someone else pointed out) is that %SCAN cannot access DATA set variable values, such as the values of DATA set variable FILE1. However SCAN can access the values of a DATA step variable. Also, %SCAN can only access the values of macro variables.

--
Paige Miller
Tom
Super User Tom
Super User

If you want the macro to generate these three statements:

Page1=scan(file1, -1, ',');
Page2=scan(file2, -1, ',');
Page3=scan(file3, -1, ',');

Then tell it to just do that.

%do i=1 %to 3;
Page&i=scan(file&i, -1, ',');
%end;

But there is no need for macro code.  You can use normal SAS code instead. Use arrays.

data my;
  set table;
  array file[3];
  array page[3] $30 ;
  do index=1 to dim(file);
    page[index]=scan(file[index], -1, ',');
  end;
  drop index;
run;

Set the length specification in the array definition for PAGE to the maximum length the variables will need to hold last word from the FILE variables.  Or if the PAGE1 to PAGE3 variables already exist in the input dataset TABLE then remove the length specification from the ARRAY statement.

Kurt_Bremser
Super User

No macro needed, only a data step DO loop:

data my;
set table;
array file{3} $50 file1-file3;
array page{3} $20 page1-page3;
do i =  1 to 3;
  page{i} = scan(file{i},-1,',');
end;
run;
Reeza
Super User

There are reserved keywords you shouldn't use as variable names in a macro, file is one of them.

 

https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/mcrolref/p0y43hj7lzhq1gn1r68h65wzljbt.htm

sas-innovate-2024.png

Available on demand!

Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 7 replies
  • 374 views
  • 1 like
  • 7 in conversation