DATA Step, Macro, Functions and more

Macro Logic to find Palindromes

Reply
Occasional Contributor
Posts: 17

Macro Logic to find Palindromes

Hi, 

 

I need to identify all palindromes within a directory. I use a proc contents and proc sort to identify the datasets within a directory, like so: 

 

proc contentss data = dPath._all_ out = dFiles (keep = memname);
run; 

proc sort data = dFiles nodupkey; 
by memname;
run;

I want to identify palindromes within this directory. As it stands, the macro parameter would take in a string and reverse it. However, I would like to do this for all rows/columns for any dataset. How would I adapt the following logic to work for all columns/rows in a dataset? 

 

%macro palindrome (parameter = ?); 

%let string = %sysfunc(reverse(%sysfunc(compress([WHAT TO PUT HERE?],,sp);
%let reverse = %sysfunc(compress([WHAT TO PUT HERE?]);

%if %upcase(&string.) = %upcase(&reverse.)  %then %do;
ods output = "/palindrome"
%end; 

Super User
Super User
Posts: 9,829

Re: Macro Logic to find Palindromes

Posted in reply to lhsumdalum

And who told you that you need to use macro?  All that does is generate Base SAS which is the programming language and Base SAS has this functionality:

data want;
  set have;
  if strip(reverse(string))=strip(string) then palindrome="Yes";
run; 
Occasional Contributor
Posts: 17

Re: Macro Logic to find Palindromes

Thank you for the reply, I plan to use macros because I need to do this for all datasets within a directory. So, instead of the user inputting the string to check if there is a palindrome, I need that to be done dynamically, i.e. identify any palindromes within a dataset. 

Super User
Super User
Posts: 9,829

Re: Macro Logic to find Palindromes

Posted in reply to lhsumdalum
data _null_;
  set sashelp.vcolumn (where=(libname="WORK"));
  by memname;
  if first.memname then call execute('data '||strip(memname)||'; set '||strip(memname)||';');
  call execute('if strip(reverse('||strip(name)||'))=strip('||strip(name)||') then '||strip(name)||'_palindrome="Yes";');
  if last.memname then call execute(';run;');
run;

Will do the palindrome check for every variable in every dataset in the work library. If you just want one dataset, then update the the where clause to be:

(where=(libname="WORK" and memname="TMP"))

For example only does TMP in WORK library, upcase is important.

 

 

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