我在Stata中有几行代码。我希望只有当行引用的.txt文件先验存在时才会执行这些行。我想知道是否有一个我可以使用的shell命令,我可以嵌入if
语句。
例如,可能存在以下内容并且可能:
insheet using "file.txt" if ('file.txt')
我的意图是仅在文件insheet
存在的情况下file.txt
。我担心的是,如果我有insheet
语句但文件不存在,程序会因语法错误而停止,失败,死亡或其他任何调用它。
答案 0 :(得分:4)
立即回答是否定。由于多种原因,没有类似语法的内容。
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 和/或选项,则由于其他原因可能会导致命令失败。因此,一般来说,检查文件是否存在似乎是一种更好的策略。
答案 1 :(得分: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
,这将捕获语法错误。有关[{1}}和capture
。