03-12-2018 10:30 AM
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;
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;
03-12-2018 10:39 AM
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;
03-12-2018 10:42 AM
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.
03-12-2018 10:48 AM
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.