All,
Is it possible to unzip a .zip file in SAS. we have disabled XMCD so can't use X commands to unzip them. looking for SAS code.
Thanks,
SS
You can use DOPEN() and DREAD() to get a list of the members in the ZIP file.
*-----------------------------------------------------------------------------;
* Get list of members in the ZIP file ;
*-----------------------------------------------------------------------------;
%let fname=C:\downloads\test1.xlsx;
data filelist;
length fileref $8 fname $256 fnum 8 memname $256.;
fname = symget('fname');
rc=filename(fileref,fname,'zip');
did=dopen(fileref);
do fnum=1 to dnum(did);
memname=dread(did,fnum);
output;
end;
did=dclose(did);
rc=filename(fileref);
drop fileref did rc;
run;
You can then use FCOPY() to copy the files. You can use the DLCREATEDIR option and LIBNAME() function to make any required subdirectories. Use RECFM=F LRECL=512 to copy the files as binary.
*-----------------------------------------------------------------------------;
* Copy members to files in target directory ;
*-----------------------------------------------------------------------------;
%let dname=c:\downloads\test_unzip ;
%let dlcreatedir=%sysfunc(getoption(dlcreatedir));
options dlcreatedir;
data results;
set filelist ;
length libref in out $8 outfile $256.;
rc1=filename(in,fname,'zip',catx(' ','recfm=f','lrecl=512','member=',quote(trim(memname))));
outfile=symget('dname');
rc2=libname(libref,outfile);
do level=1 to countw(memname,'/')-1;
outfile=catx('\',outfile,scan(memname,level,'/'));
rc2=libname(libref,outfile);
end;
rc2=libname(libref);
outfile=catx('\',outfile,scan(memname,level,'/'));
rc3=filename(out,outfile,,'recfm=f lrecl=512');
rc4=fcopy(in,out);
length msg $ 384;
if rc4 then msg=sysmsg();
drop libref in out ;
run;
options &dlcreatedir ;
Example Resutls:
proc print data=results;
var fnum memname outfile ;
run;
Obs fnum memname outfile 1 1 [Content_Types].xml c:\downloads\test_unzip\[Content_Types].xml 2 2 xl/worksheets/sheet1.xml c:\downloads\test_unzip\xl\worksheets\sheet1.xml 3 3 xl/worksheets/_rels/sheet1.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet1.xml.rels 4 4 xl/worksheets/sheet2.xml c:\downloads\test_unzip\xl\worksheets\sheet2.xml 5 5 xl/worksheets/_rels/sheet2.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet2.xml.rels 6 6 xl/worksheets/sheet3.xml c:\downloads\test_unzip\xl\worksheets\sheet3.xml 7 7 xl/worksheets/_rels/sheet3.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet3.xml.rels 8 8 xl/worksheets/sheet4.xml c:\downloads\test_unzip\xl\worksheets\sheet4.xml 9 9 xl/worksheets/_rels/sheet4.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet4.xml.rels 10 10 xl/worksheets/sheet5.xml c:\downloads\test_unzip\xl\worksheets\sheet5.xml 11 11 xl/worksheets/_rels/sheet5.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet5.xml.rels 12 12 xl/worksheets/sheet6.xml c:\downloads\test_unzip\xl\worksheets\sheet6.xml 13 13 xl/worksheets/_rels/sheet6.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet6.xml.rels 14 14 xl/worksheets/sheet7.xml c:\downloads\test_unzip\xl\worksheets\sheet7.xml 15 15 xl/worksheets/_rels/sheet7.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet7.xml.rels 16 16 xl/worksheets/sheet8.xml c:\downloads\test_unzip\xl\worksheets\sheet8.xml 17 17 xl/worksheets/_rels/sheet8.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet8.xml.rels 18 18 xl/worksheets/sheet9.xml c:\downloads\test_unzip\xl\worksheets\sheet9.xml 19 19 xl/worksheets/_rels/sheet9.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet9.xml.rels 20 20 xl/worksheets/sheet10.xml c:\downloads\test_unzip\xl\worksheets\sheet10.xml 21 21 xl/worksheets/_rels/sheet10.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet10.xml.rels 22 22 xl/worksheets/sheet11.xml c:\downloads\test_unzip\xl\worksheets\sheet11.xml 23 23 xl/worksheets/_rels/sheet11.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet11.xml.rels 24 24 xl/worksheets/sheet12.xml c:\downloads\test_unzip\xl\worksheets\sheet12.xml 25 25 xl/worksheets/_rels/sheet12.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet12.xml.rels 26 26 xl/worksheets/sheet13.xml c:\downloads\test_unzip\xl\worksheets\sheet13.xml 27 27 xl/worksheets/_rels/sheet13.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet13.xml.rels 28 28 xl/worksheets/sheet14.xml c:\downloads\test_unzip\xl\worksheets\sheet14.xml 29 29 xl/worksheets/_rels/sheet14.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet14.xml.rels 30 30 xl/worksheets/sheet15.xml c:\downloads\test_unzip\xl\worksheets\sheet15.xml 31 31 xl/worksheets/_rels/sheet15.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet15.xml.rels 32 32 xl/worksheets/sheet16.xml c:\downloads\test_unzip\xl\worksheets\sheet16.xml 33 33 xl/worksheets/_rels/sheet16.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet16.xml.rels 34 34 xl/worksheets/sheet17.xml c:\downloads\test_unzip\xl\worksheets\sheet17.xml 35 35 xl/worksheets/_rels/sheet17.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet17.xml.rels 36 36 xl/worksheets/sheet18.xml c:\downloads\test_unzip\xl\worksheets\sheet18.xml 37 37 xl/worksheets/_rels/sheet18.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet18.xml.rels 38 38 xl/workbook.xml c:\downloads\test_unzip\xl\workbook.xml 39 39 xl/styles.xml c:\downloads\test_unzip\xl\styles.xml 40 40 xl/sharedStrings.xml c:\downloads\test_unzip\xl\sharedStrings.xml
Do you know what is in the file? Does it have one file or multiple files?
What types of files are in the file? If they are just text file(s) then perhaps you can just read directly from the zip file without unzipping it.
data want;
infile 'myfile.zip' zip member='myfile.csv' dsd firstobs=2 truncover;
....
run;
You can use DOPEN() and DREAD() to get a list of the members in the ZIP file.
*-----------------------------------------------------------------------------;
* Get list of members in the ZIP file ;
*-----------------------------------------------------------------------------;
%let fname=C:\downloads\test1.xlsx;
data filelist;
length fileref $8 fname $256 fnum 8 memname $256.;
fname = symget('fname');
rc=filename(fileref,fname,'zip');
did=dopen(fileref);
do fnum=1 to dnum(did);
memname=dread(did,fnum);
output;
end;
did=dclose(did);
rc=filename(fileref);
drop fileref did rc;
run;
You can then use FCOPY() to copy the files. You can use the DLCREATEDIR option and LIBNAME() function to make any required subdirectories. Use RECFM=F LRECL=512 to copy the files as binary.
*-----------------------------------------------------------------------------;
* Copy members to files in target directory ;
*-----------------------------------------------------------------------------;
%let dname=c:\downloads\test_unzip ;
%let dlcreatedir=%sysfunc(getoption(dlcreatedir));
options dlcreatedir;
data results;
set filelist ;
length libref in out $8 outfile $256.;
rc1=filename(in,fname,'zip',catx(' ','recfm=f','lrecl=512','member=',quote(trim(memname))));
outfile=symget('dname');
rc2=libname(libref,outfile);
do level=1 to countw(memname,'/')-1;
outfile=catx('\',outfile,scan(memname,level,'/'));
rc2=libname(libref,outfile);
end;
rc2=libname(libref);
outfile=catx('\',outfile,scan(memname,level,'/'));
rc3=filename(out,outfile,,'recfm=f lrecl=512');
rc4=fcopy(in,out);
length msg $ 384;
if rc4 then msg=sysmsg();
drop libref in out ;
run;
options &dlcreatedir ;
Example Resutls:
proc print data=results;
var fnum memname outfile ;
run;
Obs fnum memname outfile 1 1 [Content_Types].xml c:\downloads\test_unzip\[Content_Types].xml 2 2 xl/worksheets/sheet1.xml c:\downloads\test_unzip\xl\worksheets\sheet1.xml 3 3 xl/worksheets/_rels/sheet1.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet1.xml.rels 4 4 xl/worksheets/sheet2.xml c:\downloads\test_unzip\xl\worksheets\sheet2.xml 5 5 xl/worksheets/_rels/sheet2.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet2.xml.rels 6 6 xl/worksheets/sheet3.xml c:\downloads\test_unzip\xl\worksheets\sheet3.xml 7 7 xl/worksheets/_rels/sheet3.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet3.xml.rels 8 8 xl/worksheets/sheet4.xml c:\downloads\test_unzip\xl\worksheets\sheet4.xml 9 9 xl/worksheets/_rels/sheet4.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet4.xml.rels 10 10 xl/worksheets/sheet5.xml c:\downloads\test_unzip\xl\worksheets\sheet5.xml 11 11 xl/worksheets/_rels/sheet5.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet5.xml.rels 12 12 xl/worksheets/sheet6.xml c:\downloads\test_unzip\xl\worksheets\sheet6.xml 13 13 xl/worksheets/_rels/sheet6.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet6.xml.rels 14 14 xl/worksheets/sheet7.xml c:\downloads\test_unzip\xl\worksheets\sheet7.xml 15 15 xl/worksheets/_rels/sheet7.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet7.xml.rels 16 16 xl/worksheets/sheet8.xml c:\downloads\test_unzip\xl\worksheets\sheet8.xml 17 17 xl/worksheets/_rels/sheet8.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet8.xml.rels 18 18 xl/worksheets/sheet9.xml c:\downloads\test_unzip\xl\worksheets\sheet9.xml 19 19 xl/worksheets/_rels/sheet9.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet9.xml.rels 20 20 xl/worksheets/sheet10.xml c:\downloads\test_unzip\xl\worksheets\sheet10.xml 21 21 xl/worksheets/_rels/sheet10.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet10.xml.rels 22 22 xl/worksheets/sheet11.xml c:\downloads\test_unzip\xl\worksheets\sheet11.xml 23 23 xl/worksheets/_rels/sheet11.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet11.xml.rels 24 24 xl/worksheets/sheet12.xml c:\downloads\test_unzip\xl\worksheets\sheet12.xml 25 25 xl/worksheets/_rels/sheet12.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet12.xml.rels 26 26 xl/worksheets/sheet13.xml c:\downloads\test_unzip\xl\worksheets\sheet13.xml 27 27 xl/worksheets/_rels/sheet13.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet13.xml.rels 28 28 xl/worksheets/sheet14.xml c:\downloads\test_unzip\xl\worksheets\sheet14.xml 29 29 xl/worksheets/_rels/sheet14.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet14.xml.rels 30 30 xl/worksheets/sheet15.xml c:\downloads\test_unzip\xl\worksheets\sheet15.xml 31 31 xl/worksheets/_rels/sheet15.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet15.xml.rels 32 32 xl/worksheets/sheet16.xml c:\downloads\test_unzip\xl\worksheets\sheet16.xml 33 33 xl/worksheets/_rels/sheet16.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet16.xml.rels 34 34 xl/worksheets/sheet17.xml c:\downloads\test_unzip\xl\worksheets\sheet17.xml 35 35 xl/worksheets/_rels/sheet17.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet17.xml.rels 36 36 xl/worksheets/sheet18.xml c:\downloads\test_unzip\xl\worksheets\sheet18.xml 37 37 xl/worksheets/_rels/sheet18.xml.rels c:\downloads\test_unzip\xl\worksheets\_rels\sheet18.xml.rels 38 38 xl/workbook.xml c:\downloads\test_unzip\xl\workbook.xml 39 39 xl/styles.xml c:\downloads\test_unzip\xl\styles.xml 40 40 xl/sharedStrings.xml c:\downloads\test_unzip\xl\sharedStrings.xml
The documentation (see Maxim 1) of FILENAME Statement: ZIP Access Method shows what you can do in SAS with ZIP and GZIP files.
It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.
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.