BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
desertsp
Obsidian | Level 7

I'm using a macro I found online to create Windows directories on my local disk. It's failing if the directory name contains hyphens.

 

Can explain what is going on?

 

Here's the problematic code (source)

%MACRO makeDirectory(DIR=);
  %LET COUNT=0;
  %LET DLM=\;

  %IF %SUBSTR(&DIR,%LENGTH(&DIR),1) NE &DLM %THEN %DO;
    %LET DIR=&DIR&DLM;
                                                  %END;
  %DO J=1 %TO %LENGTH(&DIR);
    %IF %SUBSTR(&DIR,&J,1)=&DLM %THEN %DO;
      %LET COUNT=%EVAL(&COUNT+1);
                                      %END; 
  %END;

  %LET DRIVE=%SUBSTR(&DIR,1,3);
  %LET LEVEL=&DRIVE;

  %DO I=2 %TO &COUNT;
    %LET WORD=%SCAN(&DIR,&I,&DLM);
    %LET LNEW=&LEVEL&WORD&DLM;
    data _null_;
    rc=filename('newdir',"&lnew");
      c=dopen('newdir');
      if c=0 then new=dcreate("&word","&level");
    run;
    %LET LEVEL=&LNEW;
  %END;
%MEND;	

/* this will fail */
%makeDirectory(Dir=C:\TEMP\WITH-HYPHENS);

 

Here's the error from the log:

SYMBOLGEN:  Macro variable DIR resolves to C:\TEMP\WITH-HYPHEN\
SYMBOLGEN:  Macro variable J resolves to 13
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric
       operand is required. The condition was: %SUBSTR(&DIR,&J,1)=&DLM
SYMBOLGEN:  Macro variable DLM resolves to \
ERROR: The macro MAKEDIRECTORY will stop executing.

Thanks!

1 ACCEPTED SOLUTION

Accepted Solutions
PaigeMiller
Diamond | Level 26
%IF %QSUBSTR(&DIR,%LENGTH(&DIR),1) NE &DLM %THEN %DO;

But yes, I agree with @Reeza, this is a lot of work to write such a macro when you can use a built-in function to do the same thing. 

--
Paige Miller

View solution in original post

4 REPLIES 4
Reeza
Super User

Any reason not to use the DCREATE() function directly?

http://documentation.sas.com/?docsetId=lefunctionsref&docsetTarget=p1aj29pf4cxnirn15q5hmf0tv438.htm&...

 

data _null_;
rc=dcreate("With-Hyphens", "C:\_localdata\temp\");
put rc;
run;



Or try the method here:
https://blogs.sas.com/content/sasdummy/2013/07/02/use-dlcreatedir-to-create-folders/

desertsp
Obsidian | Level 7

Thank you for replying.

 

I'm not using DCREATE() directly because it requires that the parent directory already exists. The macro I found is iteratively creates parent directories as needed. I -think- the error is occurring in the "J loop", so I don't believe there's any problem with the actual creation of each directory (maybe I should have simplified my macro before posting!).

 

I did consider OPTIONS DLCREATEDIR however there's the risk that that option is disabled. If not for that consideration, the approach would be ideal.

PaigeMiller
Diamond | Level 26
%IF %QSUBSTR(&DIR,%LENGTH(&DIR),1) NE &DLM %THEN %DO;

But yes, I agree with @Reeza, this is a lot of work to write such a macro when you can use a built-in function to do the same thing. 

--
Paige Miller
desertsp
Obsidian | Level 7

That does the trick, thanks!

hackathon24-white-horiz.png

The 2025 SAS Hackathon has begun!

It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.

Latest Updates

How to Concatenate Values

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 4 replies
  • 2072 views
  • 2 likes
  • 3 in conversation