BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
sathya66
Barite | Level 11

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 

1 ACCEPTED SOLUTION

Accepted Solutions
Tom
Super User Tom
Super User

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

 

View solution in original post

4 REPLIES 4
Tom
Super User Tom
Super User

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;
sathya66
Barite | Level 11
It has bunch of folders and various file types. Zipped in one ENV ,copied and trying to unzip it in another ENV.
Tom
Super User Tom
Super User

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

 

hackathon24-white-horiz.png

The 2025 SAS Hackathon has begun!

It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.

Latest Updates

How to Concatenate Values

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 4 replies
  • 3011 views
  • 1 like
  • 3 in conversation