我在 Stata 中有几行代码。我希望仅当行所引用的 .txt 文件先验存在时才执行这些行。我想知道是否有一个可以用于此的 shell 命令,我可以将其嵌入到if语句中。
例如,可能存在并且可能存在以下情况:
insheet using "file.txt" if ('file.txt')
我的意图是仅在文件存在时才说insheet该文件。我担心的是,如果我有该语句但文件不存在file.txt,该程序会因语法错误而停止、失败、死亡或任何你称之为的程序。insheet
立即回答是否定的。出于多种原因,没有类似的语法。
限定符对if每个观察分别测试某些条件是否为真,并且文件是否存在不是通过观察测试观察的合适条件。
完全不同的if命令一次又一次地测试某事是否正确并且可能看起来更合适。在实践中,它不用于此目的,但要了解更多信息,请参阅help ifcmd。
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和/或选项,则可能由于其他原因导致命令失败。所以一般来说,分离出文件是否存在的检查似乎是一个更好的策略。
该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。