使用SAS导入压缩的dta文件

时间:2013-06-04 16:01:32

标签: linux sas stata

我目前正在使用以下内容将Stata创建的.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。

更新

@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

我发现了两个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"  

1 个答案:

答案 0 :(得分:3)

我不相信有办法直接这样做。如果您有一个文本文件,您可以通过您尝试使用的方法轻松完成您尝试执行的操作。但是,除DBMS = CSV或TAB之外的PROC IMPORT使用随机访问(即,在文件中返回和转发而不是顺序读取),因此它不会有效地处理字节流。

您可以编写自己的Stata解释器,但这听起来超出了您的项目范围。 (Stata文件并不难读,所以你可能像字节流一样处理它,但这仍然可能需要数周的工作。)如果你真的想尝试这个,我可以指出你需要做的文档它

最简单的选项IMO是将其压缩到临时位置,读取它,然后删除临时文件。