2017-02-17 156 views
1

我搜索了互联网,无法准确找到需要的东西。在SAS程序结束时,我使用ods package方法压缩了最终数据集(20GB)。我的数据集现在如想要的那样位于压缩文件夹中。现在,我想解压缩并阅读.sas7bdat文件,但我不太清楚该方法。SAS解压缩单个sas7bdat文件

下面是一个创建永久性SAS数据集并将其拉伸的示例。我能看该ZIP文件中,并“看到”我所需要的数据集,但我不知道如何将它解压缩,并在阅读:

** assign your path **; 
libname output "H:\SAS Example Code"; 
%let path = H:\SAS Example Code; 

** test data **; 
data output.class; set sashelp.class; run; 

** zip the permanent SAS dataset **; 
ods package(zip) open nopf; 
ods package(zip) 
    add file="&path./class.sas7bdat"; 
ods package(zip) 
    publish archive   
    properties(
     archive_name= "sashelp.class.zip"     
     archive_path="&path." 
     ); 
ods package(zip) close; 

/* BELOW THIS LINE NEEDS WORK -- HOW DO I READ IN THIS DATASET? */ 

** assign filename and point to zip file **; 
filename inzip zip "&path./sashelp.class.zip"; 

** view the .sas7bdat file within the zip file **; 
data contents(keep=memname); 
    length memname $200; 
    fid=dopen("inzip"); 
     if fid=0 then stop; 
    memcount=dnum(fid); 
     do i=1 to memcount; 
      memname=dread(fid,i); 
     output; 
     end; 
    rc=dclose(fid); 
run; 
+0

没有意识到一种原生的方式来做到这一点 - 我认为你必须管理一个unzip命令到操作系统。你有这种能力吗? – Joe

+0

而不是一个zip文件,是否添加压缩=是或使用CPT或XPT文件,而不是一个选项?然后有更简单的方法来访问文件。 – Reeza

+0

@Joe由于服务器权限,我不能使用'X'命令,但我确实使用PuTTY进行脚本和批处理。我认为我最好的选择是使用SAS压缩并在需要时使用PuTTY解压缩。 – Foxer

回答

2

基本上,您需要将文件复制出来的ZIP的文件并写入物理文件。您可以使用Chris Hemedinger在他的SAS Dummy博客上发布的实用程序。 http://blogs.sas.com/content/sasdummy/2013/09/17/copy-file-macro/

不幸的是,我无法使FCOPY()命令正确地复制文件,但他发布的宏只是使用数据步骤来复制文件。 http://blogs.sas.com/content/sasdummy/files/2013/09/binaryfilecopy.sas_.txt

所以这里是完整的程序来创建一个数据集,压缩它,解压缩到一个新的名称,并比较两个版本。

* Get path of current WORK directory ; 
%let work=%sysfunc(pathname(work)); 

* Make a new work dataset ; 
data work.class; set sashelp.class; run; 

** Make the ZIP file **; 
ods package(zip) open nopf; 
ods package(zip) add file="&work./class.sas7bdat"; 
ods package(zip) publish archive 
    properties(
     archive_name= "sashelp.class.zip" 
     archive_path="&work." 
     ) 
; 
ods package(zip) close; 

* Create filerefs pointing to the source and target ; 
filename zipin zip "&work/sashelp.class.zip" member="class.sas7bdat" ; 
filename ssdout "&work/class2.sas7bdat"; 

* Use BINARYFILECOPY macro from Chris ; 
%binaryFileCopy 
(infile=zipin 
,outfile=ssdout 
); 

* Check if it worked ; 
proc compare data=class compare=class2; run;