【问题标题】:Running a Perl script within a Stata .do file在 Stata .do 文件中运行 Perl 脚本
【发布时间】:2013-06-06 13:59:54
【问题描述】:

是否可以在 Stata .do 文件中执行 Perl 脚本?

我有一个 Stata .do 文件,我在其中对数据集进行了一些操作并以某种方式排列它。然后我有一个 Perl 脚本,此时我在其中获取一个变量,对其应用 Perl 包,并对其中一个变量进行转换。特别是,我使用了 Perl 的 NYSIIS 函数,导致脚本非常短。在 Perl 中提供此输出后,我想继续在 Stata 中进行一些额外的工作。

想到但不太理想的两个替代方案是:

  1. 编写Stata代码来做nysiis,但我更喜欢使用Perl的内置函数。

  2. outsheet 并将 Stata .do 文件的输出保存为 Perl 的 .txt。然后单独执行 Perl 脚本以获取另一个 .txt。然后将该 .txt 读入 Stata 到一个新的 .do 文件并继续。

【问题讨论】:

  • 是的,如果它可以运行batch/cmd文件:)
  • .bat调用你的perl
  • 是的,但是能做到多精确呢?

标签: perl stata


【解决方案1】:

您的方法 2 是我用来调用其他程序对 Stata 数据进行操作的方法。正如尼克所说,Stata 不一定会等待您的输出,除非您要求它这样做。您首先outsheet 文本文件,然后使用! 从Stata 调用Perl 脚本以在命令行上运行某些东西。最后,让 Stata 定期检查结果文件,使用 while 循环和 sleep 命令,这样 Stata 就不会经常检查。

outsheet using "perl_input.txt"
!perl my_perl_script.pl

while (1) {
    capture insheet using "perl_output.txt", clear
    if _rc == 0 continue, break
    sleep 10000
}

!rm perl_output.txt

在这里,您的格式化数据从 Stata 保存为perl_input.txt。接下来,您的 Perl 脚本从命令行运行,并使用 while 循环,Stata 每 10 秒检查一次输出(sleep 以毫秒为单位接受参数)。当它找到输出文件时,它会跳出while 循环。最后一行是个好主意,这样当您重用代码时,您就不会冒使用上次运行的 Perl 输出的风险。

【讨论】:

  • 我将文件名周围的“”编辑为“”。如果文件名不包含空格,则不需要它们,但它们不会造成任何伤害。当然,该示例假定文件与 Stata 工作所在的文件夹或目录相同,并且可以通过指定文件夹或目录来概括。
  • 请问我理解是否正确?听起来这个解决方案是我在原始帖子中列出的第二个建议的改进版本?听起来我首先运行 stata 代码并将第一个 .txt 文件排除在外。然后我在 stata 休眠时运行 perl 代码。 perl 代码完成后不久,Stata 将停止休眠,插入 perl 吐出的 .txt 文件,然后继续 .do 文件?
  • 基本正确。逻辑是当没有文件可以读入时,Stata 被告知sleep 更多时间。capture 吃掉来自insheet 的任何错误,因为该文件不存在。
  • 正如尼克所说。在我的示例中,Stata 将每 10 秒检查一次文件。睡眠只是为了在 perl 脚本运行时最大限度地减少 Stata 的 CPU 使用率。如果运行你的 perl 脚本并保存文件不需要很长时间,你可以让它只休眠 1 秒而不是 10 秒。如果需要几个小时,你可以让它每分钟检查一次。 if _rc == 0 行告诉 Stata 只有在 Stata 成功地从 perl 中找到输出文件时才退出 while 循环。这里的一个危险是,如果你的 perl 脚本被破坏,stata 将永远休眠(或者直到你 Ctrl-C
  • !perl my_perl_script 实际上打开了一个命令提示符窗口并运行 perl 脚本?如果我用别的东西来做perl怎么办?特别是,我使用 cygwin。
【解决方案2】:

我认为主要问题是尽管您可以使用 shell 调用其他东西,但 Stata 不会等待结果。

help shell 开始,看看有什么可能,但你的#2 听起来确实最简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2013-06-12
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多