BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
xizidememeda
Calcite | Level 5

Hello guys, I write a sas macro to import multiple txt files as follows, however, it fails no matter how I improve it.

The log says the physical files don't exist.

Can anyone help me? 

%macro all_on_index(syear=, eyear=);

%do year = &syear %to &eyear;
	%do month = 1 %to 12;
	%let ym = %eval(&year*100 + &month);

data work.op;
 infile 'D:files\price_&ym..txt' dsd dlm='09'x truncover;
 input var1:$20.     var2:YYMMDD8.;

%if year = &syear and month = 1 %then %do;
	data work._all;
		set work.op;
	run;
	%end;
%else %do;
	data work._all;
		set work._all work.op;
	run;
	%end;

	%end;
%end;

%mend all_options_on_index;

I will appreciate it very much for your help!!

1 ACCEPTED SOLUTION

Accepted Solutions
Kurt_Bremser
Super User

I marked the issues:

%macro all_on_index(syear=, eyear=);
%local year month ym; /* make your macro behave if it's called from another macro that uses the same variables */
%do year = &syear %to &eyear;
  %do month = 1 %to 12;
    %let ym = %eval(&year*100 + &month);

data work.op;
infile "D:files\price_&ym..txt" dsd dlm='09'x truncover; /* use double quotes to resolve macro variables */
input var1:$20. var2:YYMMDD8.;
run; /* always a good idea to define clear step boundaries */

    %if &year = &syear and month = 1 %then %do; /* "year" is just a string, use &year for the macro variable */

data work._all;
set work.op;
run;

    %end;
    %else %do;

data work._all;
set work._all work.op;
run;

    %end;
  %end;
%end;

%mend all_options_on_index;

You can simplify the code:

%macro all_on_index(syear=, eyear=);
%local year month ym;
%do year = &syear %to &eyear;
  %do month = 1 %to 12;
    %let ym = %eval(&year*100 + &month);

data work.op;
infile "D:files\price_&ym..txt" dsd dlm='09'x truncover;
input var1:$20. var2:YYMMDD8.;
run;

data work._all;
set
%if &year ne &syear or &month ne 1 %then work._all;
  work.op
;
run;

  %end;
%end;

%mend all_options_on_index;

 

View solution in original post

5 REPLIES 5
Kurt_Bremser
Super User

I marked the issues:

%macro all_on_index(syear=, eyear=);
%local year month ym; /* make your macro behave if it's called from another macro that uses the same variables */
%do year = &syear %to &eyear;
  %do month = 1 %to 12;
    %let ym = %eval(&year*100 + &month);

data work.op;
infile "D:files\price_&ym..txt" dsd dlm='09'x truncover; /* use double quotes to resolve macro variables */
input var1:$20. var2:YYMMDD8.;
run; /* always a good idea to define clear step boundaries */

    %if &year = &syear and month = 1 %then %do; /* "year" is just a string, use &year for the macro variable */

data work._all;
set work.op;
run;

    %end;
    %else %do;

data work._all;
set work._all work.op;
run;

    %end;
  %end;
%end;

%mend all_options_on_index;

You can simplify the code:

%macro all_on_index(syear=, eyear=);
%local year month ym;
%do year = &syear %to &eyear;
  %do month = 1 %to 12;
    %let ym = %eval(&year*100 + &month);

data work.op;
infile "D:files\price_&ym..txt" dsd dlm='09'x truncover;
input var1:$20. var2:YYMMDD8.;
run;

data work._all;
set
%if &year ne &syear or &month ne 1 %then work._all;
  work.op
;
run;

  %end;
%end;

%mend all_options_on_index;

 

xizidememeda
Calcite | Level 5

I rewrite my complete codes based on your reply and comments and it works very well!

Thanks very much for your help!!Smiley LOLHeart

gamotte
Rhodochrosite | Level 12
Hello, macro variables inside single quoted strings are not resolved.
Try
infile "D:files\price_&ym..txt" dsd dlm='09'x truncover;
instead.
xizidememeda
Calcite | Level 5

Yes, you are right! Many many thanks for your help!Smiley Wink

Reeza
Super User
Since all your files are the same you don't need to use a macro, you can use a wildcard and read them all in one step.



sas-innovate-wordmark-2025-midnight.png

Register Today!

Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.


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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 5 replies
  • 1233 views
  • 0 likes
  • 4 in conversation