DATA Step, Macro, Functions and more

Using Macro to create Format, via a Do loop

Reply
N/A
Posts: 1

Using Macro to create Format, via a Do loop

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;

Super User
Posts: 19,855

Re: Using Macro to create Format, via a Do loop

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;

Super User
Super User
Posts: 7,074

Re: Using Macro to create Format, via a Do loop

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;

Ask a Question
Discussion stats
  • 2 replies
  • 291 views
  • 0 likes
  • 3 in conversation