2017-02-17 154 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;