【问题标题】:Stata and Named PipesStata 和命名管道
【发布时间】:2014-08-27 03:02:25
【问题描述】:

我可以使用命名管道直接在 Stata 中读取 .csv.gz 和 .dta.gz 文件,而不是通过临时文件解压缩,如 here 所述。如果有人了解它们,我有两个关于如何在 Stata 中使用命名管道的问题。

  1. 帮助建议执行以下操作(编辑:这确实对我有用)

     #!/bin/sh
     fname=$1
     rm -f mypipe.pip
     mknod mypipe.pip p
     zcat $fname > mypipe.pip &
     !myprog testfile.Z >& /dev/null < /dev/null
     infile a b c using mypipe.pip
    

    我想了解为什么下面的代码不起作用。

     !rm -f mypipe.pip && mknod mypipe.pip p && zcat filename.gz > mypipe.pip &
     infile a b c using mypipe.pip
    
  2. 在保存和压缩 .dta 文件时,是否有类似的方法来使用命名管道?我试图复制上面的代码但没有成功。

【问题讨论】:

  • 在#2 Stata 可以自己压缩文件,所以我认为你根本不需要管道。参见例如blog.stata.com/tag/zip 在#1 上,您没有说“不起作用”是什么意思,但我疯狂地猜测,Stata 在尝试 infile 之前不会等待外壳完成。您可以尝试将操作系统调用包装在另一个 Stata 程序中。然后 Stata 将(应该?)在尝试 infile 之前必须等待它完成。
  • 我对 #1 的第二个想法是我的建议无济于事,因为它只会创建同一问题的另一个版本。但我没有做任何测试。
  • 你好,尼克。谢谢。关于#2,据我了解,Stata 命令 zipfile 需要一个 .dta 文件并对其进行压缩。但是,我想直接压缩我正在使用的数据集——而不是先将它写在驱动器上。这减少了 I/O 负担。关于#2,mypipe.pip & 中的 & 号的目的是执行下一个命令而不等待命令完成,即我认为我们确实希望 Stata 在管道中解压缩所有内容之前开始读取。
  • 好的;但是您的“不起作用”似乎仍然无法解释。我怀疑 Stata 会让你在不保存的情况下压缩任何东西。没有您可以命名的文件。
  • 你好,尼克。我想做人们在 R 中可以做的事情:stackoverflow.com/questions/17492409/… 请注意,即使 stata 没有此特定命令,命名管道也可能允许这样做(Stata 将命名管道视为要使用的临时文件就足够了或保存)。毕竟,它似乎可以使用。

标签: stata named-pipes


【解决方案1】:

编辑: 这是因为您没有重新创建 bash 文件 + stata do 文件中调用的代码。您刚刚完成了 bash 文件。
您的代码应为:

!rm -f mypipe.pip && mknod mypipe.pip p && (zcat filename.gz > mypipe.pip &) >& /dev/null < /dev/null
infile a b c using mypipe.pip

如果您可以按照尼克关于清除“不起作用”的建议发布您遇到的错误,那将很有帮助。

无论如何,您应该先尝试几件事

(1) 根据您指向 Stata 网站的链接创建一个 bash 脚本,而不是尝试在一行中执行此操作
(2) 确保你的文件名没有空格,或者在$fname周围加上双引号
(3) 如果你运行 *nix
确保chmod 775 /path/to/myprog 使其可执行 (4) 再次根据您的链接制作一个do文件
(5) 在 testfile.Z 之后放一个井号,如下所示:!myprog testfile.Z #&gt;&amp; /dev/null &lt; /dev/null infile a b c using mypipe.pip 这允许输出转到标准输出,这样您就可以看到发生了什么。您可以在诊断出问题后将其删除。
(6) 将!myprog改为!/path/to/myprog
(7) 执行do mytest.do
(8) 告诉我们 Stata 所说的错误是否仍然存在。

只要您在infile 之后指定所有变量名,它就可以在我的机器上使用.csv 文件,但它不能使用dta 文件。这是程序

首先按照建议制作一个名为 myprog 的 bash 文件

#!/bin/sh
    cd /path/to/dir
    fname=$1
    rm -r mypipe.pip
    mknod mypipe.pip p
    zcat $fname > /path/to/dir/mypipe.pip &

通过在终端中输入使脚本可执行: `chmod 775 /path/to/dir/myprog'

然后制作一个do文件。我有一个名为 complete 的数据集,用于测试主体

cd /path/to/dir

insheet using complete.csv
ds *
global vars "`r(varlist)'"

!7z a test.csv.gz complete.csv

!/path/to/dir/myprog test.csv.gz >& /dev/null < /dev/null
infile $vars using mypipe.pip, clear

成功。我正在使用 Stata 版本 12 运行 Debian Linux Wheezy(实际上是 #!但同样的交易)

【讨论】:

  • 当你说它可以在你的机器上使用 .csv 文件时,你的意思是,你将数据放在一个 .csv 文件中,然后将其压缩并作为你的testfile.Z 使用?您能否展示您的确切过程(数据输入、代码、文件分发等)和设置的详细信息(Stata 版本、操作系统、终端等)?原始海报也应该这样做。我已经尝试了整个命名管道问题,但直到现在都没有成功。在zcat 通话后,Stata 似乎冻结了。 bash 进程在后台打开,但没有其他任何反应。
  • 我必须点击Stata Break按钮手动结束bash进程(在系统管理器中)解冻它。我尝试使用 Mint Debian 和 Stata 12.1。
  • 我的意思和你在第一条评论中所说的完全一样。我将修改我上面的帖子以包含我的确切测试。
  • 嘿,对不起,我不清楚。如 stata 帮助中所示,我打开 .csv.gz 或 .dta.gz 没有问题。我只是很难理解为什么最简单的语法(在 #1 中)不起作用。现在,#2 是关于我无法将 .dta 和 .csv 文件保存在管道中的事实,即使使用类似于帮助中给出的代码。
  • 其实你的单行命令对我不起作用。不过没关系。你知道为什么 & /dev/null
猜你喜欢
  • 2018-07-10
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
相关资源
最近更新 更多