dear all,
I am trying to split a dataset and export them as .txt file by following codes
%macro split(k=);
data test;
set Sa_step5.Pat_name_with_address_dis end=eof nobs=count;
if eof then call symput('nobs', left(count));
run;
%let n=%sysfunc(int(%eval(&nobs/&k)));
%put &nobs &n;
%do i=1 %to &n;
data Sa_step6.Pat_name_with_address_dis&i test;
set test;
if _N_<=&k then output Sa_step6.Pat_name_with_address_dis&i;
else output test;
run;
PROC EXPORT DATA=Sa_step6.Pat_name_with_address_dis&i
OUTFILE= "C:\Users\70660\Desktop\Pat_name_with_address_dis\Pat_name_with_address_dis&i.txt"
DBMS=tab REPLACE;
delimiter=',';
RUN;
%end;
%mend;
%split(k=1000);
however, I create the file like 'Pat_name_with_address_dis1txt' rather than 'Pat_name_with_address_dis1.txt', could you give me some suggestions about this?
thanks in advance
Try Inserting an extra dot '..' after the macro variable as the single dot will be interpreted as the macro variable boundary.
PROC EXPORT DATA=Sa_step6.Pat_name_with_address_dis&i
OUTFILE= "C:\Users\70660\Desktop\Pat_name_with_address_dis\Pat_name_with_address_dis&i..txt"
DBMS=tab REPLACE;
delimiter=',';
RUN;
Add another period after the macro variable.
FYI - its faster to use a data set option to filter your data rather than to create a temporary data set.
Your code isn't going to split your data set by the way, it'll create cumulative data. Ie your first data set will have 1000 records, your second will have 2000, your third would have 3000 if the size was 1000 per data set. Is that what you want?
@France wrote:
dear all,
I am trying to split a dataset and export them as .txt file by following codes
%macro split(k=); data test; set Sa_step5.Pat_name_with_address_dis end=eof nobs=count; if eof then call symput('nobs', left(count)); run; %let n=%sysfunc(int(%eval(&nobs/&k))); %put &nobs &n; %do i=1 %to &n; data Sa_step6.Pat_name_with_address_dis&i test; set test; if _N_<=&k then output Sa_step6.Pat_name_with_address_dis&i; else output test; run; PROC EXPORT DATA=Sa_step6.Pat_name_with_address_dis&i OUTFILE= "C:\Users\70660\Desktop\Pat_name_with_address_dis\Pat_name_with_address_dis&i.txt" DBMS=tab REPLACE; delimiter=','; RUN; %end; %mend; %split(k=1000);
however, I create the file like 'Pat_name_with_address_dis1txt' rather than 'Pat_name_with_address_dis1.txt', could you give me some suggestions about this?
thanks in advance
Try Inserting an extra dot '..' after the macro variable as the single dot will be interpreted as the macro variable boundary.
PROC EXPORT DATA=Sa_step6.Pat_name_with_address_dis&i
OUTFILE= "C:\Users\70660\Desktop\Pat_name_with_address_dis\Pat_name_with_address_dis&i..txt"
DBMS=tab REPLACE;
delimiter=',';
RUN;
No need for macro code or separate SAS dataset to just generate multiple delimited files from a single source dataset.
Try this little program to split SASHELP.CLASS into files with max of 10 records.
%let path=%sysfunc(pathname(work));
data _null_;
set sashelp.class ;
link file;
put (_all_) (+0);
return;
file:
fileno=1+int(_n_/10);
length filename $300;
filename = catx('/',"&path",cats('filename_',fileno,'.txt'));
file out dsd dlm='09'x filevar=filename ;
return;
run;
If you want a header row on each file then add more logic to test if you are starting a new file and write it.
I'd suggest
fileno=1+int((_n_-1)/10);
to split, e.g., 20 observations into 10+10 rather than 9+10+1.
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 16. Read more here about why you should contribute and what is in it for you!
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.
Select SAS Training centers are offering in-person courses. View upcoming courses for: