LISTSERV at the University of Georgia
Menubar Imagemap
Home Browse Manage Request Manuals Register
Previous messageNext messagePrevious in topicNext in topicPrevious by same authorNext by same authorPrevious page (September 2006, week 3)Back to main SAS-L pageJoin or leave SAS-L (or change settings)ReplyPost a new messageSearchProportional fontNon-proportional font
Date:   Mon, 18 Sep 2006 21:11:59 +0000
Reply-To:   toby dunn <tobydunn@HOTMAIL.COM>
Sender:   "SAS(r) Discussion" <SAS-L@LISTSERV.UGA.EDU>
From:   toby dunn <tobydunn@HOTMAIL.COM>
Subject:   Re: macro bug I just can't see
Comments:   To: datanull@GMAIL.COM
In-Reply-To:   <7367b4e20609181318l5c8337b4j396596d5715d9b46@mail.gmail.com>
Content-Type:   text/plain; format=flowed

Data _Null_ ;

I dont ever think I write superior code, I just hack at this gig.

As for the comma delimiter, yeah I gave it some thought and well the code would have to be tweeked to accept a comma. On the other hand commas are the worst delimiter in macro lists and should be avoided at all costs unless it is the case where you build a comma delimited list and use it with no modifications in a SQL statement. Which is probably why I didnt even think of a comma as a delimiter, it simply doesnt make good sense to use it as a delimiter 99.99% of the time.

Toby Dunn

When everything is coming at you all at once, your in the wrong lane.

A truly happy person is someone who can smile and enjoy the scenery on a detour.

From: "data _null_;" <datanull@GMAIL.COM> Reply-To: "data _null_;" <datanull@GMAIL.COM> To: SAS-L@LISTSERV.UGA.EDU Subject: Re: macro bug I just can't see Date: Mon, 18 Sep 2006 16:18:41 -0400

I thought you were offering your program as a superior replacement to the code Michael posted, were he mentioned plural word removal. I thought if that were the case you would want to revise your program to be more suitable to the task.

You may also want to test the macro with alternate delimiters. I don't reckon a comma delimiter is gonna fly.

On 9/18/06, toby dunn <tobydunn@hotmail.com> wrote: >I didnt need to test it any further as it was only set up to have one value >in the wordstorm, I guess in hind sight I should have not has an 's' in the >parameter name. But if one is so inclined to want more than one word in >the >list then: > >%Macro RemoveWrd( List = , WordsToRM = , DLM = %Str( ) ) ; >%Local I Stop NewList ; > >%Let Stop = %Eval( %SysFunc( CountC( &List , &DLM ) ) + ( %Length( &List ) > > >0 ) ) ; > >%Do I = 1 %To &Stop ; > %If %SysFunc( IndexW( %Upcase( &WordsToRM ) , %Scan( %Upcase(&List) , &I >, &DLM ) , &DLM ) ) = 0 %Then %Do ; > %Let NewList = &NewList %Scan( &List , &I , &DLM ) ; > %End ; >%End ; > >&NewList > >%Mend RemoveWrd ; > >%Let List = Anno AAA b mean Cc ; >%Put NewList = %RemoveWrd( List = &List , WordsToRM = Mean Anno ) ; > > > > >Toby Dunn > >When everything is coming at you all at once, your in the wrong lane. > >A truly happy person is someone who can smile and enjoy the scenery on a >detour. > > > > > >From: "data _null_;" <datanull@gmail.com> >To: "toby dunn" <tobydunn@hotmail.com> >CC: SAS-L@listserv.uga.edu >Subject: Re: macro bug I just can't see >Date: Mon, 18 Sep 2006 15:24:27 -0400 > >I think you need to test this macro a bit more. When you put two >words in WordsToRM it doesn't work. > >201 %Let List = Anno AAA b mean Cc; >202 %Put NewList = %RemoveWrd(List = &List , WordsToRM = mean Anno ); >NewList = Anno AAA b mean Cc > > >On 9/18/06, toby dunn <tobydunn@hotmail.com> wrote: > >Micheal , > > > >%Macro RemoveWrd( List = , WordsToRM = , DLM = %Str( ) ) ; > >%Local I Stop NewList ; > > > >%Let Stop = %Eval( %SysFunc( CountC( &List , &DLM ) ) + ( %Length( &List >) > > > > >0 ) ) ; > > > >%Do I = 1 %To &Stop ; > > %If ( %Index( %Scan( %Upcase(&List) , &I , &DLM ) , %Upcase( &WordsToRM >) > >) = 0 ) > > %Then %Do ; > > %Let NewList = &NewList %Scan( &List , &I , &DLM ) ; > > %End ; > >%End ; > > > >&NewList > > > >%Mend RemoveWrd ; > > > >%Let List = Anno AAA b mean Cc ; > >%Put NewList = %RemoveWrd( List = &List , WordsToRM = Mean ) ; > >%Put NewList = %RemoveWrd( List = &List , WordsToRM = Anno ) ; > > > > > > > > > >Toby Dunn > > > >When everything is coming at you all at once, your in the wrong lane. > > > >A truly happy person is someone who can smile and enjoy the scenery on a > >detour. > > > > > > > > > > > >From: Michael Friendly <friendly@YORKU.CA> > >Reply-To: Michael Friendly <friendly@YORKU.CA> > >To: SAS-L@LISTSERV.UGA.EDU > >Subject: macro bug I just can't see > >Date: Mon, 18 Sep 2006 14:45:35 -0400 > > > >Here's a macro designed to remove a word (or better yet, words) from a > >string, as when you want to construct a variable list, but remove BY or > >ID variables. I'm getting a run-time error that I just can't see, even > >though I've written this sort of macro many times before. Can someone > >help? > > > >%macro remwords(string,remove,dlm=%str( )); > >%*--------------------------------------------------; > >%* Remove any word contained in Remove from Strong > >%*--------------------------------------------------; > > %local count word; > > %let count=1; > > %let word = %scan(&string,&count,&dlm); > > %let result=; > > %do %while(%quote(&word)^= ); > > %if(%index( > > %upcase(&dlm.&remove.&dlm), > > %upcase(&dlm.&word.&dlm) )=0) > > %then %let result = &result &word;; > > %put REMWORDS: word=&word result=&result; > > %let count = %eval(&count+1); > > %let word = %scan(&string,&count,&dlm); > > %end; > > &result > >%mend; > > > >%let words = Anno AAA b mean Cc; > >%put words: &words; > >%let rest = %remwords(&words, mean); > >%let rest = %remwords(&rest, anno); > >%put rest: &rest; > > > >---- log ----- > > > >1 %macro remwords(string,remove,dlm=%str( )); > >2 %*--------------------------------------------------; > >3 %* Remove any word contained in Remove from Strong > >4 %*--------------------------------------------------; > >5 %local count word; > >6 %let count=1; > >7 %let word = %scan(&string,&count,&dlm); > >8 %let result=; > >9 %do %while(%quote(&word)^= ); > >10 %if(%index( > >11 %upcase(&dlm.&remove.&dlm), > >12 %upcase(&dlm.&word&dlm) )=0) > >13 %then %let result = &result &word;; > >14 %put REMWORDS: word=&word result=&result; > >15 %let count = %eval(&count+1); > >16 %let word = %scan(&string,&count,&dlm); > >17 %end; > >18 &result > >19 %mend; > >20 > >21 %let words = Anno AAA b mean Cc; > >22 %put words: &words; > >words: Anno AAA b mean Cc > >23 %let rest = %remwords(&words, mean); > >REMWORDS: word=Anno result=Anno > >REMWORDS: word=AAA result=Anno AAA > >REMWORDS: word=b result=Anno AAA b > >REMWORDS: word=mean result=Anno AAA b > >REMWORDS: word=Cc result=Anno AAA b Cc > >NOTE: Line generated by the macro variable "RESULT". > >23 Anno AAA b Cc > >2 The SAS System 14:36 Monday, September > >18, 2006 > > > > ____ > > 180 > > > >ERROR 180-322: Statement is not valid or it is used out of proper order. > > > >24 %let rest = %remwords(&rest, anno); > >25 %put rest: &rest; > >rest: > > >


Back to: Top of message | Previous page | Main SAS-L page