I'm using some old syntax - that I didn't write and don't understand very well - to create SAS data sets from .xpt files.
* -------------------------------------------------------------------------------------------------------------------; ************************************************** 2013-2014 ********************************************************; * -------------------------------------------------------------------------------------------------------------------; * Demographics; LIBNAME xptfile xport '/home/myname/Projects/NHANES/XPT Files/DEMO_H.XPT' access=readonly; * Drug Use; LIBNAME xptfile xport '/home/myname/Projects/NHANES/XPT Files/DUQ_H.XPT' access=readonly; * Medical Conditions; LIBNAME xptfile xport '/home/myname/Projects/NHANES/XPT Files/MCQ_H.XPT' access=readonly; * Prescription Medications - Drug Information; LIBNAME xptfile xport '/home/myname/Projects/NHANES/XPT Files/RXQ_DRUG.XPT' access=readonly; * Prescription Medications; LIBNAME xptfile xport '/home/myname/Projects/NHANES/XPT Files/RXQ_RX_H.XPT' access=readonly; * Cigarette Use; LIBNAME xptfile xport '/home/myname/Projects/NHANES/XPT Files/SMQ_H.XPT' access=readonly; * Recent Tobacco Use; LIBNAME xptfile xport '/home/myname/Projects/NHANES/XPT Files/SMQRTU_H.XPT' access=readonly; PROC COPY INLIB=xptfile OUTLIB=nhanes; RUN;
Is there a way to run this once and have all .xpt files in the "xptfile" library copied into the "nhanes" library as SAS data sets?
Currently, I need to run each LIBNAME statement individually and then run the PROC COPY. Not very efficient.
Thank you.
libname x xport ('c:\temp\stocks.xpt' 'c:\temp\class.xpt' );
proc copy in=x out=work;
run;
A libname statement can be assigned to cover a collection of other libnames (or a list of directories). So a proc copy could transcribe all the datasets in a collection of libraries (each listed in the "aggregate" library) to a destination library. Here's an example:
libname sdat1 'c:\temp\sasdata1';
libname sdat2 'c:\temp\sasdata2';
data sdat1.class; set sashelp.class; run;
data sdat2.cars; set sashelp.cars; run;
libname srclibs (sdat1 sdat2);
libname tmp 'c:\temp';
proc copy out=tmp in=srclibs ;
run;
The log reports copying both datasets, one from each SDATx library, to the TMP library.
418 libname srclibs (sdat1 sdat2);
NOTE: Libref SRCLIBS was successfully assigned as follows:
Levels: 2
Engine(1): V9
Physical Name(1): c:\temp\sasdata1
Engine(2): V9
Physical Name(2): c:\temp\sasdata2
419 libname tmp 'c:\temp';
NOTE: Libref TMP was successfully assigned as follows:
Engine: V9
Physical Name: c:\temp
420 proc copy out=tmp in=srclibs ;
421 run;
NOTE: Copying SRCLIBS.CARS to TMP.CARS (memtype=DATA).
NOTE: There were 428 observations read from the data set SRCLIBS.CARS.
NOTE: The data set TMP.CARS has 428 observations and 15 variables.
NOTE: Copying SRCLIBS.CLASS to TMP.CLASS (memtype=DATA).
NOTE: There were 19 observations read from the data set SRCLIBS.CLASS.
NOTE: The data set TMP.CLASS has 19 observations and 5 variables.
NOTE: PROCEDURE COPY used (Total process time):
real time 0.01 seconds
cpu time 0.01 seconds
I have no idea whether this behavior is replicated when reading from a collection of XPORT-engine libraries.
Also: if a dataset name appears in multiple locations in the "collective" library, then, in my experience, only the first one (i.e. the leftmost library) is accessed.
libname x xport ('c:\temp\stocks.xpt' 'c:\temp\class.xpt' );
proc copy in=x out=work;
run;
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 25. 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.