diff --git a/base/mf_writefile.sas b/base/mf_writefile.sas new file mode 100644 index 0000000..74fd800 --- /dev/null +++ b/base/mf_writefile.sas @@ -0,0 +1,67 @@ +/** + @file + @brief Creates a text file using pure macro + @details Creates a text file of up to 10 lines. If further lines are + desired, feel free to [create an issue]( + https://github.com/sasjs/core/issues/new), or make a pull request! + + The use of PARMBUFF was considered for this macro, but it would have made + things problematic for writing lines containing commas. + + Usage: + + %mf_writefile(&sasjswork/myfile.txt,l1=some content,l2=more content) + data _null_; + infile "&sasjswork/myfile.txt"; + input; + list; + run; + + @param [in] fpath Full path to file to be created or appended to + @param [in] mode= (O) Available options are A or O as follows: + @li A APPEND mode, writes new records after the current end of the file. + @li O OUTPUT mode, writes new records from the beginning of the file. + @param [in] l1= First line + @param [in] l2= Second line (etc through to l10) + +

Related Macros

+ @li mf_writefile.test.sas + + @version 9.2 + @author Allan Bowe +**/ +/** @cond */ + +%macro mf_writefile(fpath,mode=O,l1=,l2=,l3=,l4=,l5=,l6=,l7=,l8=,l9=,l10= +)/*/STORE SOURCE*/; +%local fref rc fid i total_lines; + +/* find number of lines by reference to first non-blank param */ +%do i=10 %to 1 %by -1; + %if %str(&&l&i) ne %str() %then %goto continue; +%end; +%continue: +%let total_lines=&i; + +%if %sysfunc(filename(fref,&fpath)) ne 0 %then %do; + %put &=fref &=fpath; + %put %str(ERR)OR: %sysfunc(sysmsg()); + %return; +%end; + +%let fid=%sysfunc(fopen(&fref,&mode)); + +%if &fid=0 %then %do; + %put %str(ERR)OR: %sysfunc(sysmsg()); + %return; +%end; + +%do i=1 %to &total_lines; + %let rc=%sysfunc(fput(&fid, &&l&i)); + %let rc=%sysfunc(fwrite(&fid)); +%end; +%let rc=%sysfunc(fclose(&fid)); +%let rc=%sysfunc(filename(&fref)); + +%mend mf_writefile; +/** @endcond */ \ No newline at end of file diff --git a/tests/crossplatform/mf_writefile.test.sas b/tests/crossplatform/mf_writefile.test.sas new file mode 100644 index 0000000..5472243 --- /dev/null +++ b/tests/crossplatform/mf_writefile.test.sas @@ -0,0 +1,74 @@ +/** + @file + @brief Testing mf_writefile.sas macro + +

SAS Macros

+ @li mf_writefile.sas + @li mp_assert.sas + +**/ + +%mf_writefile(&sasjswork/myfile.txt,l1=some content,l2=more content) +data _null_; + infile "&sasjswork/myfile.txt"; + input; + if _n_=2 then call symputx('test1',_infile_); +run; + +%mp_assert( + iftrue=(&syscc=0), + desc=Check code ran without errors, + outds=work.test_results +) +%mp_assert( + iftrue=(&test1=more content), + desc=Checking line was created, + outds=work.test_results +) + +%mf_writefile(&sasjswork/myfile.txt,l1=some content,l2=different content) +data _null_; + infile "&sasjswork/myfile.txt"; + input; + if _n_=2 then call symputx('test2',_infile_); +run; + +%mp_assert( + iftrue=(&syscc=0), + desc=Check code ran without errors for test2, + outds=work.test_results +) +%mp_assert( + iftrue=(&test2=different content), + desc=Checking second line was overwritten, + outds=work.test_results +) + +%global test3 test4; +%mf_writefile(&sasjswork/myfile.txt + ,mode=a + ,l1=%str(aah, content) + ,l2=append content +) +data _null_; + infile "&sasjswork/myfile.txt"; + input; + if _n_=2 then call symputx('test3',_infile_); + if _n_=4 then call symputx('test4',_infile_); +run; + +%mp_assert( + iftrue=(&syscc=0), + desc=Check code ran without errors for test2, + outds=work.test_results +) +%mp_assert( + iftrue=(&test3=different content), + desc=Checking second line was not overwritten, + outds=work.test_results +) +%mp_assert( + iftrue=(&test4=append content), + desc=Checking fourth line was appended, + outds=work.test_results +) \ No newline at end of file