confirm file: 检查一个文件是否存在

2016-09-06 李春涛 爬虫俱乐部 爬虫俱乐部

有读者问,我的程序中间需要调用比如SAS程序的模块,但是Stata调用SAS(forwindows)模块后,SAS开始运行了,在运行尚未结束时,如果希望Stata停下来等待,直到SAS运行结束再开始执行下一行Stata命令,如何实现呢?

要回答这个问题,其实需要知道读者是如何调用SAS命令的,Stata调用外部命令的方式有两个,分别是shell命令和winexec命令。

如 果是用shell命令调用,当外部命令执行的时候,Stata其实是停下来的,比如,读者可以用shell notepad 测试一下,从命令窗口执行shell notepad 以后,notepad被打开,但此时Stata的command window就处于inactive状态,直到我们将notepad关闭掉。

读者可能是用winexec 调用SAS程序的!但是我们要注意,winexec命令的help文件是这么说的。


也就是说在我们使用winexec命令的时候,Stata是不会停下来等我们这个程序运行完的。那么用这个命令调用SAS模块的时候,该如何让Stata停下来呢?

第一个方法是,用sleep 命令,比如执行SAS命令后,让Stata休眠20秒,可以用如下的命令:

sleep 20000

但是这样做需要我们预估SAS命令需要执行多久,如果反复调用,可能每次SAS程序执行需要的时间也是不同的!

好吧,我们来试用第二种方法:假定SAS执行完以后会制造一个文件,比如说是d:/tempsas.txt。我们可以让Stata反复确认这个文件是否存在,如果存在了就说明这个SAS命令执行完了。确认一个文件是否存在的命令是confirm,试试如下的命令吧:

confirm filed:/tempsas.txt

如果文件d:/tempsas.txt不存在,则该命令会返回一个error code。

为了避免程序发现该文件不存在而停下来,我们最好在命令前面添加capture:

capture confirm filed:/tempsas.txt


这样无论文件d:/tempsas.txt是否存在,Stata都会运行了,我们只需要用_rc提取这一error code就行了,所以,完整的程序应该是:

capture confirm filed:/tempsas.txt

   while _rc {      /* file does not exist! */

       capture confirm file d:/tempsas.txt

    }

不 过这样做是有代价的,因为Stata不停地检查文件d:/tempsas.txt的存在性,这样会浪费大量的CPU资源。Stata会想:“不停滴问我那 个鬼文件存不存在!一秒钟问几百次几千次你烦不烦呀!每次问完你不能歇几秒钟呀?”对,睡觉,每次问完了sleep 1000,睡觉1000毫秒!就是这个程序!

capture confirm filed:/tempsas.txt

   while _rc {      /* 如果文件不存在 */

       sleep 1000   /* 还是先睡觉1000毫秒吧! */

       capture confirm file d:/tempsas.txt

}

当然,休息多久你自己来定了,如果SAS工作比较复杂,可以每次休息多几秒!

capture confirm filed:/tempsas.txt

   while _rc {      /* 如果文件不存在 */

       sleep 5000   /* 还是先睡觉5000毫秒吧! */

       capture confirm file d:/tempsas.txt

    }

但是我们在这个程序运行时中,是无法看到运行的过程的。这样,我们可以加一条命令,每次当检查到这个文件不存在的时候,我们都在屏幕上显示“这个文件不存在”。

capture confirm filed:/tempsas.txt

while _rc {      /* 如果文件不存在 */

        disp “这个文件不存在”

       sleep 5000   /* 还是先睡觉5000毫秒吧! */

       capture confirm file d:/tempsas.txt

}


   
此外,我们还可以通过local命令定义一个计数器,每进行一次循环加1,这样还可以看到我们一共对这个文件检查了多少次。

我们团队原来的微信公众号是“数据处理援助中心”,现在正式搬家到“爬虫俱乐部”,欢迎关注。新的公众号开始,我们推出有问必答栏目,对您提出的问题,我们会尽力回答,并通过推文的形式进行发布。我们也欢迎各位粉丝向公众号投稿。


欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:xueyuan19920310@163.com

投稿要求

1)必须原创,禁止抄袭;

2)必须准确,详细,有例子,有截图;

注意事项

1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名。

2)邮件请注明投稿,邮件名称为投稿”+“推文名称

3)如果大家遇到关于stata处理分析数据的问题,也可以给该邮箱写邮件,邮件名称为提问”+“问题名称或者关键词,我们会在后期的推文里给予解答。



微信扫一扫
关注该公众号