Hello,
I've been trying to execute the following code:
%let line = '%put NOTE: foo;';
data _null_;
infile "echo &line. >> /opt/testfolder/test_program.sas" pipe;
input;
put _infile_;
run;
However, when getting the results from the execution, the file I'm trying to append is not appended.
If I remove the "%" character from the first line, the command works just fine.
How could I achieve the desired result (writing this piece of code to a file)? I've tried to use some functions such as str, nrstr, quote and nrquote and I wasn't able to execute it properly.
Thank you
Hello @bsas94,
I would rather omit the single quotes in the %LET statement and instead use the %NRSTR function to mask the percent sign and the semicolon:
%let line = %nrstr(%put NOTE: foo;);
Then you can use the %TSLIT macro (see Sample 25076: Resolve a macro variable within single quotation marks) in the INFILE statement to add quotes where needed. Apparently, you are on a Unix system, whereas my suggestions below were tested on a Windows workstation (using a different path, of course).
To append the SAS code %put NOTE: foo; without quotes to a text file:
infile %tslit(echo &line >> /opt/testfolder/test_program.sas) pipe;
To append '%put NOTE: foo;' including the single quotes to a text file:
infile %tslit(echo %tslit(&line) >> /opt/testfolder/test_program.sas) pipe;
Hello @bsas94,
I would rather omit the single quotes in the %LET statement and instead use the %NRSTR function to mask the percent sign and the semicolon:
%let line = %nrstr(%put NOTE: foo;);
Then you can use the %TSLIT macro (see Sample 25076: Resolve a macro variable within single quotation marks) in the INFILE statement to add quotes where needed. Apparently, you are on a Unix system, whereas my suggestions below were tested on a Windows workstation (using a different path, of course).
To append the SAS code %put NOTE: foo; without quotes to a text file:
infile %tslit(echo &line >> /opt/testfolder/test_program.sas) pipe;
To append '%put NOTE: foo;' including the single quotes to a text file:
infile %tslit(echo %tslit(&line) >> /opt/testfolder/test_program.sas) pipe;
Huh?
Aren't you making this way too complicated?
data _null_;
file "/opt/testfolder/test_program.sas" mod;
put '%put NOTE: foo;';
run;
If you have the value in a macro variable use SYMGET() to get it into a character variable.
data _null_;
file "/opt/testfolder/test_program.sas" mod;
length line $200;
line = symget('line');
put line ;
run;
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
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.
Ready to level-up your skills? Choose your own adventure.