从命令ado dir生成的列表中重新安装包

时间:2016-02-09 21:55:18

标签: install stata restore

我正在Windows升级后恢复Stata。我有一个从ado dir生成的包的列表,格式如下:

[1]来自http://fmwww.bc.edu/RePEc/bocode/m的软件包mdesc       ' MDESC':模块列出缺失值的普遍性

[2]包裹来自http://fmwww.bc.edu/RePEc/bocode/u       ' UNIVAR':模块用盒子和胡须图生成单变量摘要

来自http://www.ats.ucla.edu/stat/stata/ado/analysis

[3]包标签       tabmiss。显示缺失值和非缺失值的列表

我有很多软件包,想要重新安装它们,而无需通过net cd指定每个目录/网址。虽然在循环中使用net cd以及net installssc install以及包名称是微不足道的(如下所示),但似乎可以使用此任务的自动方法。

net cd http://www.ats.ucla.edu/stat/stata/ado/analysis
    local ucla tabmiss csgof powerlog ldfbeta 
        foreach x of local ucla {
            net install `x'
        }

1 个答案:

答案 0 :(得分:2)

据我所知,除了adonet之外,没有内置或自动的跟踪和管理已安装软件包的方法。

我也倾向于同意@Nick Cox这个任务看起来很奇怪,我无法想象新的Stata如何安装或重新安装可以知道之前安装的是什么,但我发现问题有其他原因引起了人们的兴趣。

主要原因是在两台计算机上需要相同软件包的多台计算机上安装Stata的用户。当我购买新计算机并安装Stata时,我遇到了类似的问题,但我希望所有使用的软件包都可用。除了移动ado目录或所选内容之外,我不知道任何快速解决方案。

这里可以在一台计算机上使用ado dir的输出来确定需要在具有新Stata安装的第二台计算机上安装的内容。

使用foreach循环建议的方法可以节省您输入或复制/粘贴大量包和URL的时间。但与此同时,如果您只有少数存储库中的许多软件包,这将非常有用,因为每次在示例中显示时,您都需要net cd到URL。

另一种解决方案是程序化解决方案。如您所知,ado dir将列出每个已安装的软件包,URL以及软件包的简短描述。使用它,日志文件和内置I / O功能,可以编写一个简短的程序来自动化该过程并动态构建一个包含安装已安装软件包的命令的do文件。

下面的代码为我在计算机上安装的每个软件包生成一个包含命令(在本例中为net describe package, from(url))的do文件。

clear *

tempfile log1
log using "`log1'", text name(mylog)
ado dir
log close mylog

tempname logfile
file open `logfile' using "`log1'", read
file read `logfile' line

file open dfh using "path/to/your/dofile.do", write replace

local pckage "package"

while r(eof) == 0 {
    if `: list pckage in line' {

        local packageName : word 3 of `line'
        local dirName : word 5 of `line'
        di "`packageName' `dirName'"

        file write dfh "net describe `packageName', from(`dirName')"
        file write dfh _newline

    }
    file read `logfile' line
}

file close `logfile'
file close dfh

在上面的代码中,我创建了一个临时文件来写一个.txt日志文件并将ado dir的内容存储在该文件中。

然后,我使用file open打开日志文件,并在while循环中逐行读取。

在循环之上,我在/path/to/your/dofile.do创建一个do文件来保存循环的输出 - 动态创建的命令与我机器上安装的软件包有关。

只要r(eof) = 0,循环就会迭代,其中r(eof)是文件标记的结尾。我使用if语句来整理包含单词package的日志文件的行,因为我只对那些包含包名和URL的行感兴趣。

if块内部,我解析本地宏line以提取包名称和URL /目录名称。

这很重要:这部分代码假定宏中的第3个和第5个字分别始终是包名和URL - 从 ado dir <的输出中确认em>在执行之前。

当您准备好执行时,您还需要将正在写入循环内部文件句柄dfh的命令更改为您想要的(net install等)。

有关使用filelocaltempfile的更多帮助,请在Stata中执行以下任何操作:

help file          
help extended_fcn 
help macrolists

可能有更好的方法来解析ado dir的内容,但这对我有用。当然,我总是建议您花时间了解代码的作用,以便您可以根据自己的具体情况进行必要的调整。