楼主: eblog
12025 34

[编程问题求助] Stata编程(讨论6) [推广有奖]

  • 0关注
  • 45粉丝

贵宾

情多累美人

已卖:2565份资源

院士

79%

还不是VIP/贵宾

-

威望
8
论坛币
3893966 个
通用积分
735.4915
学术水平
142 点
热心指数
182 点
信用等级
92 点
经验
73666 点
帖子
2284
精华
3
在线时间
1891 小时
注册时间
2006-3-20
最后登录
2025-12-25

楼主
eblog 发表于 2010-2-6 10:23:10 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
如何在Stata程序中调用DOS程序?如:

@echo off&setlocal enabledelayedexpansion
for %%a in (*j*.txt) do (
copy %%a d:\*.txt
)

1.把以上DOS程序代码用记事本保存为DOS批处理文件:r.bat ,
2.双击文件 r.bat 将把当前目录中所有名字中带有字母j的txt文档Copy至D盘根目录下

问题:

请问如何编写Stata程序调用以上DOS程序,且能够将代码中的加黑部分指定为可变参数?
假设编好的Stata命令为 mytest.ado,在Stata中执行:mytest doc k*, t(E:\) 则把当前目录中所有以k开头的doc文档Copy至E盘根目录下
(PS:个人感觉比较难处理的是上面DOS代码中的循环)

此讨论的意义:

考虑到网络诸多可自由下载的DOS程序原代码,加上DOS对目录、文件和磁盘的强大处理能力,如果能用Stata自由调用DOS程序,应该是有较好的应用意义的
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:stata编程 Stata tata Expansion stata程序 记事本 根目录 程序 如何 字母

已有 3 人评分学术水平 热心指数 信用等级 收起 理由
liutangliu + 1 + 1 + 1 好的意见建议
swuferuc + 1 + 1 + 1 精彩帖子
dxystata + 1 好的意见建议

总评分: 学术水平 + 3  热心指数 + 2  信用等级 + 2   查看全部评分

本帖被以下文库推荐

沙发
eblog 发表于 2010-2-6 11:01:15
以上DOS程序代码仅作例示,

注:可参考10楼和12楼

藤椅
maikal 发表于 2010-2-6 15:35:34
nice idea, fabulous

板凳
arlionn 在职认证  发表于 2010-2-6 15:38:30
Exciting question!!

经测试,可采用如下方式直接执行 dos 批处理程序。

在stata中输入 shell ,则可弹出 DOS 命令窗口,在此处直接输入 r.bat 命令,回车即可。

因此,所有DOS命令都可以通过stata界面执行。使用之前,只需输入 shell 命令转换界面即可。


补充一句,上述过程可直接在stata执行如下命令完成:

shell r.bat

也就是说,stata可以直接执行 DOS 批处理程序。

报纸
eblog 发表于 2010-2-6 15:48:36
arlionn 发表于 2010-2-6 15:38
Exciting question!!

经测试,可采用如下方式直接执行 dos 批处理程序。

在stata中输入 shell ,则可弹出 DOS 命令窗口,在此处直接输入 r.bat 命令,回车即可。

因此,所有DOS命令都可以通过stata界面执行。使用之前,只需输入 shell 命令转换界面即可。


补充一句,上述过程可直接在stata执行如下命令完成:

shell r.bat

也就是说,stata可以直接执行 DOS 批处理程序。
呵呵,谢谢!
但问题还没有解决,如何指定参数才是关键

地板
eblog 发表于 2010-2-6 16:05:18
我写了个程序,做了个变通,等于是把部分DOS代码“翻译”成了Stata代码,稍显复杂,还有没有更简便的方法?最好是能直接调用DOS程序,又能指定参数的那种。

注:以下代码运行(程序仅在Windows操作系统测试通过)后,执行:mytest dta, f(g) t(d:\),将把当前目录中所有名称中包含字母g的dta文件Copy至D盘根目录中,并统计出Copy的文件总数:

capture prog drop mytest
prog define mytest
    version 9
    syntax anything(name=clist)[, Find(string) To(string)]
    if "`to'"!=""{
        local mydir="`to'\"
    }
    else {
        local mydir=""
    }
    local list: dir "`r(cmd)'" files"*.`clist'"
    local n=0
    foreach x of local list {        
        if strpos("`x'","`find'")!=0{
            local temp="`to'"+"`x'"
            !copy "`x'" "`temp'"
            local n=`n'+1
        }        
    }
    di as result _n "`n' " as txt "files copy to " as result " `to'"
end
已有 1 人评分学术水平 热心指数 收起 理由
swuferuc + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

7
arlionn 在职认证  发表于 2010-2-6 16:14:55
我觉得最好能编写一个“读写”文件的程序,把stata输入项中的参数传递给 DOS 命令集,然后输出新定义的 DOS 批处理文件,命名为 *.bat。整个过程相当于在修改 DOS 批处理文件。
接下来,只需执行 shell *.bat 文件即可。
这种处理方法的好处是,只需很少的修改就可以在stata中使用现有的 DOS 批处理文件了。

基本原则:尽可能少地改动 DOS 批处理文件,stata只发挥参数传递功能。

8
eblog 发表于 2010-2-6 16:25:13
arlionn 发表于 2010-2-6 16:14
我觉得最好能编写一个“读写”文件的程序,把stata输入项中的参数传递给 DOS 命令集,然后输出新定义的 DOS 批处理文件,命名为 *.bat。整个过程相当于在修改 DOS 批处理文件。
接下来,只需执行 shell *.bat 文件即可。
这种处理方法的好处是,只需很少的修改就可以在stata中使用现有的 DOS 批处理文件了。

基本原则:尽可能少地改动 DOS 批处理文件,stata只发挥参数传递功能。
嗯,如果能这样就太好了

9
lidasage 发表于 2010-2-6 16:45:56
不错,受教了!

10
arlionn 在职认证  发表于 2010-2-6 17:10:10
eblog 发表于 2010-2-6 16:25
arlionn 发表于 2010-2-6 16:14
我觉得最好能编写一个“读写”文件的程序,把stata输入项中的参数传递给 DOS 命令集,然后输出新定义的 DOS 批处理文件,命名为 *.bat。整个过程相当于在修改 DOS 批处理文件。
接下来,只需执行 shell *.bat 文件即可。
这种处理方法的好处是,只需很少的修改就可以在stata中使用现有的 DOS 批处理文件了。

基本原则:尽可能少地改动 DOS 批处理文件,stata只发挥参数传递功能。
嗯,如果能这样就太好了
粗略程序如下,TO(string) 选项尚未处理,留给 eblog 吧。

*------------------------------------------------

cap program drop testdos
program define testdos
version 10
   syntax , Find(string) TYpe(string) Dosfile(string) [TO(string)]
   
   * error: only one word in `find'  
   * error: `type' .doc or just doc
   tempname mydos
   file open `mydos' using "`dosfile'.txt", write replace
   file write `mydos' "@echo off&setlocal enabledelayedexpansion" _n
   file write `mydos' "for %%a in (*`find'*.`type') do ( " _n
   file write `mydos' "copy %%a d:\*.txt" _n  // 此处尚未设定文件路径
   file write `mydos' ")"
   file close `mydos'
   shell rename `dosfile'.txt `dosfile'.bat
   shell `dosfile'.bat
   
end
exit
*------------------------------------------------


测试方式:

set trace on
testdos, find(j) type(txt) dos(s)
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
swuferuc + 1 + 1 精彩帖子
eblog + 2 + 5 + 1 精彩帖子,呵呵,没想到要用file

总评分: 学术水平 + 3  热心指数 + 6  信用等级 + 1   查看全部评分

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-1 22:17