2013-07-01 34 views
3

我在Stata中有幾行代碼。我希望行只有在行引用的.txt文件存在時才能被執行。我想知道是否有可用於此的shell命令,我可以將其嵌入到if語句中。使用Shell檢查文件是否存在,並且只有在存在的情況下執行一組命令

例如可能像下面存在且可能:

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

我的意圖是說insheet文件file.txt只有當它的存在。我擔心的是,如果我有那個insheet聲明但該文件不存在,程序會因爲語法錯誤而停止,失敗,死亡或者其他任何你稱之爲的錯誤。

回答

4

即時答案是否定的。由於多種原因,沒有類似的語法。

  1. if限定符測試某些條件是否爲真分別爲每個觀測和是否一個文件存在不是通過觀察測試觀察的適當的條件。

  2. 完全不同的if命令一次只測試一次是否是真的,看起來更合適。在實踐中,它不用於此目的,但要了解更多信息,請參見help ifcmd

  3. 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呼叫更加複雜,並且有變量列表和/或選項,則可能由於其他原因而導致命令失敗。所以一般來說,檢查文件的存在似乎是一個更好的策略。

3

confirm命令有你在找什麼。

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

或者,你可以在insheet命令,該命令將捕獲的語法錯誤之前把capture。有關captureconfirm的更多信息,請參閱[P]手冊。

相關問題