0

我目前正在使用以下内容将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 ;

斯塔塔

我在这里找到了两个用于使用和保存 gzip 文件的Stata 模块。命令是gusegsave。注意后面的“.gz”需要去掉,这有点烦人。好的一面是,如果 myfile.dta 没有被压缩,那么guse仍然会读入它。这允许我们的分析师用 guse/gsave 替换任何现有的命令usesave

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

// save
gsave "/home/banjer/data/myfile.dta"  
4

1 回答 1

4

我不相信有办法直接做到这一点。如果你有一个文本文件,你可以通过你尝试使用的方法轻松地做你想做的事情。但是,除 DBMS=CSV 或 TAB 之外的 PROC IMPORT 使用随机访问(即在文件中来回而不是顺序读取),因此它不会有效地处理字节流。

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

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

于 2013-06-04T16:12:19.737 回答