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;
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!
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.
Ready to level-up your skills? Choose your own adventure.