2013-06-04 53 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,将它解压到临时位置,读取它,然后删除临时文件。