How to zip and Unzip files using SAS?

Do you want to zip or unzip files using SAS?

This post will you to create zip and unzip files using SAS. There are 3 different methods you can use to zip and unzip files in SAS. All the method requires that NOXCMD is enabled in your SAS system.

Method 1: Zip Files in SAS Using the X command

If the NOXCMD is not set, you can use the zip command as below.

x 'zip filename1 filename2 filename3';


x 'zip /home/9to5sas/external_files/ /home/9to5sas/archives/Sales_2020.xlsx';

Method 2: Using pipe command to zip files

Filename Pipe is another means of executing Unix commands within your SAS program.

In general, it behaves like any other filename statement – it accepts data written from SAS (FILE/PUT) or provides data for SAS to read (INFILE/INPUT).

It does differently because the data comes from/is sent to a UNIX command rather than working with a simple file.

Using the PIP engine on an INFILE statement, the SAS data step can read any messages that the command generates. It will enable you to debug if the UNIX command doesn’t work.

filename oscmd pipe "zip /home/9to5sas/input_files/ /home/9to5sas/input_files/sales_2020.xlsx 2>&1";

data _null_;
infile oscmd;
put _infile_;

The 2>&1 reroutes stderr (standard error) output to standard output, so you get it in your data step.

After running your command like this, any messages that are returned by the system will appear in the SAS log.

adding: home/9to5sas/input_files/sales_2020.xlsx (deflated 25%)

Often, you’ll create a zip archive of a directory including the content of subdirectories. The -r option allows you to traverse the whole directory structure recursively:

x 'zip -r directory_name';

The default compression method of Zip is deflate. If the zip utility determines that a file cannot be compressed, it simply stores the file in the archive without compressing it using the store method. In most Linux distributions, the zip utility also supports the bzip2 compression method.

To specify a compression method, use the -Z option.

filename oscmd pipe "zip -Z bzip2 /home/9to5sas/input_files/ /home/9to5sas/input_files/sales_2020.xlsx 2>&1";
adding: home/9to5sas/input_files/sales_2020.xlsx (bzipped 18%)

The zip command allows you to specify a compression level using a number prefixed with a dash from 0 to 9. The default compression level is -6. When using -0, all files will be stored without compression. -9 will force the zip command to use an optimal compression for all files.

For example, to use the compression level -9, you would type something like this:

x 'zip -9 -r directory_name';

The higher the compression level, the more CPU-intensive the zip process is, and it will take more time to complete.

Method 3: Zip files Using Systask command

We can also use the SYSTASK command to zip or unzip files in SAS. By default SYSTASK command executes asynchronously with SAS, therefore if we need to wait for the result of the SYSTASK command before we continue we need to use WAITFOR or WAIT options.

WAITFOR option suspends the execution of the SAS program until one or a few SYSTASK commands are completed. In the following example, we have used the WAIT option to ensure that data _null_ step continues after the SYSTASK command is completed.

systask command 'zip /home/9to5sas/input_files/ /home/9to5sas/input_files/sales.xlsx' wait status=zipfiles;

data _null_;
if &zipfiles>0 or &sysrc>0 then do;
put 'ERROR Occured during the zip statement';
abort abend;
else put 'NOTE: Archiving completed successfully';

The returned code from SYSTASK command is stored in the automatic macro variable SYSRC.

If the value of SYSRC=0 then the SYSTASK command has been executed successfully, otherwise if SYSRC>0 some problems have occurred.

SYSRC variable works the same way for SYSTASK command as for the X command. The status macro variable ‘zipfiles’ indicates if the zip command was successful or not and returns an error code from the operating system command.

Creating Split Zip File

Imagine you want to store the Zip archive on a file hosting service that has a file size upload limit of 1GB, and your Zip archive is 5GB.

You can create a new split Zip file using the -s option followed by a specified size. The multiplier can be k (kilobytes), m (megabytes), g (gigabytes), or t (terabytes).

x 'zip -s 1g -r directory_name';

The command above will keep creating new archives in a set after it reaches the specified size limit.

How to zip all files in the current directory?

To create a Zip archive of all the files in the current directory use the zip command followed by the archive name and a * symbol.

x 'cd /home/9to5sas/input_files/input_files/';
x 'zip *'

How to zip all .csv files in the current directory?

To zip all CSV files in the current directory use the below zip command.

'x zip /home/9to5sas/ /home/9to5sas/inputs/*.csv'

How to Unzip files using SAS?

Similar to the zip command you can use the unzip command to unzip the files. Like any other Unix commands unzip can also be used in the x statement, pipe command or the systask command.

filename oscmd pipe "unzip -d /home/9to5sas/input_files/ /home/9to5sas/input_files/";

data _null_;
infile oscmd;
put _infile_;

The -d option is used to uncompress files to a directory.

Every week we'll send you SAS tips and in-depth tutorials


Subhro Kar is an Analyst with over five years of experience. As a programmer specializing in SAS (Statistical Analysis System), Subhro also offers tutorials and guides on how to approach the coding language. His website, 9to5sas, offers students and new programmers useful easy-to-grasp resources to help them understand the fundamentals of SAS. Through this website, he shares his passion for programming while giving back to up-and-coming programmers in the field. Subhro’s mission is to offer quality tips, tricks, and lessons that give SAS beginners the skills they need to succeed.