如何从压缩文件中读取Stata二进制格式

Dan*_*erg 5 netcat stata

Stata知识库包含有关从管道读取ASCII数据的注释,这将使人们无需在磁盘上存储解压缩版本即可读取文件。我们从未成功使用此处显示的方法-我总是收到错误消息 mypipe.pip: not found。我们有TB级的数据可以很好地压缩,因此这总是令人失望的。我们很想听听它是否对其他人有用。

在调查此问题时,我们发现了一种解决方法,它似乎好得多。与知识库建议不同,除ASCII文件外,它还可以与.dta文件一起使用。这对我们来说非常有趣。这是通过use命令的http选项完成的 。

我们的第一次尝试是将文件test.cgi添加到我们的webservers cgi-bin目录中:

#!/bin/sh
echo Content-type: application/x-stata
/usr/bin/zcat /data/sample.dta.gz
Run Code Online (Sandbox Code Playgroud)

我们发现

use http://www.nber.org/test
Run Code Online (Sandbox Code Playgroud)

该文件可以从Stata上使用,但是由于文件多次在LAN上鞭打,因此涉及很多开销,因此我们没有追求从URL中获取文件名或使其实用。

我们正在开发一种替代方案,它不需要实际的Web服务器,甚至不需要root权限。这是通过大多数Linux发行版附带的nc命令完成的,并且也可用于Windows。在Stata提示符下,运行compound命令:

.! (echo -ne "HTTP/1.0 200 OK\r\n\r\n"; zcat /data/sample.dta.gz;) | nc -l 8080 &
Run Code Online (Sandbox Code Playgroud)

此命令设置计算机以将标头和解压缩的文件传输到从端口8080读取的第一个进程。由于8080是高端口,因此不需要特殊权限即可使用它。直到从该端口读取文件时,此命令才会返回,此时它将向您显示确切的Stata请求。因为&状态,而nc等待。然后

. use http://127.0.0.1:8080
Run Code Online (Sandbox Code Playgroud)

请注意,您不能使用“ localhost”而不是127.0.0.1,因为该use命令将不接受一部分主机名。

如果您的计算机上没有nc,请查找ncat,netcat或socat。某些版本的端口号之前需要'-p'。您可以在Windows计算机上安装nc,并且应该能够执行相同的操作,但是我们尚未尝试过。

这也可以用于ascii文件,加密文件,拆分文件,也许还有其他类型。如果仅统计/传输将写入标准输出!

有一个安全问题-您放弃Unix权限位中的读取限制。它比从磁盘读取未压缩的文件还慢,但是对我们来说仍然足够快。

我们一直试图将其打包到一个ado文件中,但没有成功,因为一个用户友好的ado程序将需要自行查找可用的端口,我们还没有找到一个很好的方法来进行通信。它返回到use命令,对此我们也不知所措。我希望列表中的某个人可能会被启发提出一种方法,或者Statacorp可能只是将解压缩合并到use命令中。

丹尼尔·芬伯格feenberg@nber.org