2013-06-04 56 views
0

我目前進口Stata -created .dta文件到SAS下列要求:導入壓縮文件DTA與SAS

proc import datafile='myfile.dta' out=test dbms=dta replace; 
run; 

爲了備份文件時節省空間和帶寬,我想只保留dta文件的壓縮版本。我可以使用SAS「即時」讀取壓縮的dta文件嗎?

我已經試過:

filename foo pipe 'gunzip -c myfile.dta.gz'; 

proc import datafile=foo out=test dbms=dta replace; 
run; 

但SAS說ERROR: Random access not allowed.

我也試過proc cimport,但這似乎並不支持.dta文件。我確信我可以使用x命令在程序底部解壓縮然後刪除,但希望有一個更清晰的解決方案,因爲我會詢問另外50個SAS/Stata/R程序員來實現它。

我們在64位Linux上運行SAS 9.2 ts2m3。

UPDATE

@Joe提供爲什麼PROC進口不帶管工作的.dta文件的一些很好的見解,並提出了「臨時解壓」。

SAS

我打算把這個在一個宏,使用戶可以通過簡單的宏調用導入dta.gz

* import file ; 
x gunzip -c /home/banjer/data/myfile.dta.gz > /home/banjer/data/myfile.dta ; 

proc import datafile="/home/banjer/data/myfile.dta" out=mydata dbms=dta replace; 
run; 

* delete temp uncompressed file ; 
x rm /home/banjer/data/myfile.dta ; 


* save file ; 
proc export data=mydata dbms=dta 
    file="/home/banjer/data/jtest.dta" 
    dbms=dta replace; 
run; 

x gzip /home/banjer/data/jtest.dta ; 

塔塔

我發現了兩個Stata的模塊here使用和保存gzip壓縮文件。命令是gusegsave。請注意,尾隨的「.gz」需要保留,這有點煩人。好的一面是,如果myfile.dta沒有被壓縮,那麼guse仍然會讀入。這使我們的分析師可以用guse/gsave替換任何現有的usesave命令。

// import 
guse "/home/banjer/data/myfile.dta" 

// save 
gsave "/home/banjer/data/myfile.dta" 
+2

這與R沒有任何關係...... –

+0

我不清楚他是否打算針對R提出同樣的問題,或者是否有針對R的不同解決方案(請閱讀最後一個完整段落) 。 – Joe

+0

謝謝,我不應該包含那個'r'標籤。我可能會在後面問同樣的問題:所以我不想在一個問中問太多問題。 – Banjer

回答

3

我不相信有一種方法可以直接做到這一點。如果你有一個文本文件,你可以用你試圖使用的方法輕鬆完成你想要做的事情。但是,除DBMS = CSV或TAB以外的PROC IMPORT使用隨機訪問(即,在文件中後退和前進而不是順序讀取),因此它不會有效處理字節流。

你可以編寫自己的Stata解釋器,但這聽起來像是超出了你的項目範圍。 (Stata文件並不難讀,所以你可能可以像字節流一樣處理它,但這仍然可能是數週的工作。)如果你真的想要嘗試這個,我可以指出你需要的文檔它。

最簡單的選項是IMO,將它解壓到臨時位置,讀取它,然後刪除臨時文件。