I'm trying to use a macro to generate a user-created format that translates numbers (1, 2, ...) into state names (Alabama, Alaska, ...).
I'm trying to do it using a do loop, assigning j values 1 through 51, and cycling it through the format statement. When I do that, it output the format after each state, so that the next state overwrites it and at the end I only have one format, 51 ="Wyoming". I've tried moving the do loop and %end all over, but can't figure it out. Here's what I have so far:
DM Log 'Clear';
DM Out 'Clear';
Options PS=100 Symbolgen Mprint;
Title;
/* MACRO DO_FORMAT STARTS HERE */
%macro do_format;
proc format;
Any advice or suggestions?
%do i=1 %to 51 ;
%let state=%scan(Alabama@Alaska@Arizona@Arkansas@California@Colorado@Connecticut@Delaware@District of Columbia@
Florida@Georgia@Hawaii@Idaho@Illinois@Indiana@Iowa@Kansas@Kentucky@Louisiana@Maine@Maryland@Massachusetts@
Michigan@Minnesota@Mississippi@Missouri@Montana@Nebraska@Nevada@New Hampshire@New Jersey@New Mexico@
New York@North Carolina@North Dakota@Ohio@Oklahoma@Oregon@Pennsylvania@Rhode Island@South Carolina@
South Dakota@Tennessee@Texas@Utah@Vermont@Virginia@Washington@West Virginia@Wisconsin@Wyoming, &i, @);
value _state &i = "&state" %end;
run;
%end;
%mend do_format;
%do_format;
use cntlin instead and create a dataset.
data want;
type="C";
fmtname="state_name";
do i=1 to 51 ;
label=compress(scan("Alabama@Alaska@Arizona@Arkansas@California@Colorado@Connecticut@Delaware@District of Columbia@Florida@Georgia@Hawaii@Idaho@Illinois@Indiana@Iowa@Kansas@Kentucky@Louisiana@Maine@Maryland@Massachusetts@Michigan@Minnesota@Mississippi@Missouri@Montana@Nebraska@Nevada@New Hampshire@New Jersey@New Mexico@New York@North Carolina@North Dakota@Ohio@Oklahoma@Oregon@Pennsylvania@Rhode Island@South Carolina@South Dakota@Tennessee@Texas@Utah@Vermont@Virginia@Washington@West Virginia@Wisconsin@Wyoming", i, "@"));
start=i;
output;
end;
run;
proc format cntlin=want;
run;
You need to move the VALUE keyword before the %DO loop and the semi-colon that ends the statement after the %DO loop.
%macro do_format;
%local i states;
%let states
=Alabama@Alaska@Arizona@Arkansas@California@Colorado@Connecticut@Delaware
@District of Columbia@Florida@Georgia@Hawaii@Idaho@Illinois@Indiana@Iowa@Kansas
@Kentucky@Louisiana@Maine@Maryland@Massachusetts@Michigan@Minnesota@Mississippi
@Missouri@Montana@Nebraska@Nevada@New Hampshire@New Jersey@New Mexico
@New York@North Carolina@North Dakota@Ohio@Oklahoma@Oregon@Pennsylvania
@Rhode Island@South Carolina@South Dakota@Tennessee@Texas@Utah@Vermont
@Virginia@Washington@West Virginia@Wisconsin@Wyoming
;
proc format;
value _state
%do i=1 %to 51 ;
&i = "%scan(&states,&i,@)"
%end;
;
run;
%end;
%mend do_format;
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
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.