我目前正在将斯塔塔-created .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模块这里,用于使用和保存gzipped文件。命令是guse和gsave。请注意,尾随的".gz“需要停止,这有点烦人。好的一面是,如果myfile.dta没有被压缩,那么guse仍然会读取它。这使我们的分析人员可以用guse/gsave替换现有的任何use和save命令。
// import
guse "/home/banjer/data/myfile.dta"
// save
gsave "/home/banjer/data/myfile.dta" 发布于 2013-06-04 16:12:19
我不相信有办法直接做到这一点。如果您有一个文本文件,您可以通过尝试使用的方法轻松地完成您想要做的事情。但是,除了DBMS=CSV或TAB之外,PROC导入使用的是随机访问(即在文件中返回和转发,而不是顺序读取),因此不能有效地处理字节流。
您可以编写自己的Stata解释器,但听起来似乎超出了项目的范围。(Stata文件并不难读,所以您可能可以像处理字节流一样处理它,但这仍然可能需要几周的工作。)如果您确实想尝试这样做,我可以向您指出进行此操作所需的文档。
最简单的选择,IMO,是把枪拉链到一个临时的位置,读取它,然后删除临时文件。
https://stackoverflow.com/questions/16922441
复制相似问题