3

我在 Stata 中有几行代码。我希望仅当行所引用的 .txt 文件先验存在时才执行这些行。我想知道是否有一个可以用于此的 shell 命令,我可以将其嵌入到if语句中。

例如,可能存在并且可能存在以下情况:

 insheet using "file.txt" if ('file.txt')

我的意图是仅在文件存在时才说insheet该文件。我担心的是,如果我有该语句但文件不存在file.txt,该程序会因语法错误而停止、失败、死亡或任何你称之为的程序。insheet

4

2 回答 2

4

立即回答是否定的。出于多种原因,没有类似的语法。

  1. 限定符对if每个观察分别测试某些条件是否为真,并且文件是否存在不是通过观察测试观察的合适条件。

  2. 完全不同的if命令一次又一次地测试某事是否正确并且可能看起来更合适。在实践中,它不用于此目的,但要了解更多信息,请参阅help ifcmd

  3. Stata 没有基于成对相同单引号的特殊语法' '

但是,Stata 在这里提供了一个单独的构造

confirm file file.txt 

实际上,只要文件不存在且文件不存在,就会停止执行文件或程序。捕获错误的一般方案类似于

capture confirm file file.txt 
if _rc == 0 insheet using file.txt 
else { 
    <code if the file does not exist> 
} 

capture被认为是吃掉confirm命令的返回码。通常,如果命令有效并执行,则任何命令的返回码_rc都是 0,否则返回一些非零值。有时会测试特定的非零代码。实验表明file not found是返回码 601。查找错误码(在 [P] 错误中)的主要原因是为了传递官方外观的错误消息,但实际上了解零/非零规则是该标题下的主要细节.

此处的示例==用于测试是否相等。

请注意,insheet using file.txt如果文件不存在,则严格来说不是语法错误。就 Stata 的语言而言,这是合法的语法。然而,这是一个很好的区别:这是一个普通意义上的错误。

(稍后)有可能使整个过程短路

 capture insheet using file.txt 
 if _rc != 0 { 
      <code if the file does not exist>
 }

insheet在这种情况下,文件的不存在是命令失败的假定解释。但是,如果insheet调用更复杂,带有varlist和/或选项,则可能由于其他原因导致命令失败。所以一般来说,分离出文件是否存在的检查似乎是一个更好的策略。

于 2013-07-01T23:32:01.263 回答
3

confirm命令具有您要查找的内容。

capture confirm file "file.txt"
if !_rc {  # if the file exists, confirm will return error code 0
    insheet using "file.txt"
}

或者,您可以capture在命令之前放置一个insheet,这将捕获语法错误。查看 [P] 手册了解更多关于capture和的信息confirm

于 2013-07-01T23:31:49.857 回答