楼主: eblog
12022 34

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

11
sungmoo 发表于 2010-2-6 17:31:51
*做了一个纯stata框架下的程序,相当于把dos命令译成stata命令:
*`anything'中前者是原文件名(含目录,可含通配符),后者是到达目录,两者要用双引号
cap pr drop scopy
pr scopy
  syntax anything [,Replace]
  if strpos(`"`anything'"',`"""')==0{
    n di as error "Directories or files should be enclosed by double quotes"
    exit
  }
  token `"`anything'"',p(`"""')
  if "`3'"!=""{
    n di as error "At most two directories/files can be input"
    exit
  }
  if "`2'"=="" loc 2=c(pwd)
  _getfilename "`1'"
  loc from=substr("`1'",1,length("`1'")-length("`r(filename)'")-1)
  if "`from'"=="" loc from=c(pwd)
  loc files: dir "`from'" file "`r(filename)'"
  loc from="`from'"+"/"
  if `"`files'"'!=""{
  loc t=0
    foreach x of loc files {
      if "`replace'"!="" copy "`from'`x'" "`2'",replace
      else {
        cap copy "`from'`x'" "`2'"
        if _rc {
          n di as error "`x' already existed in `2'"
          continue
        }
      }
      loc t=`t'+1
    }
    n di "`t' copied"
  }
  else n di as error "No proper file existed in `from'"  
end
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
eblog + 1 + 5 + 2 好的意见建议!事实证明,Stata程序也能做一些事

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

12
eblog 发表于 2010-2-6 17:48:10
arlionn 发表于 2010-2-6 17:10

粗略程序如下,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)
搞定了,代码如下,加粗部分是修改过的:

cap program drop testdos
program define testdos
version 10
   syntax , Find(string) TYpe(string) Dosfile(string) [TO(string)*]   
   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 `to'*.`type'" _n
   file write `mydos' ")"
   file close `mydos'
   shell ren `dosfile'.txt `dosfile'.bat
   shell `dosfile'.bat
end

测试方式:

set trace on
testdos, find(j) type(txt) dos(s) to(d:\)

13
sungmoo 发表于 2010-2-6 18:03:05
有一个难点:文件名或目录名存在空格时的处理。

14
eblog 发表于 2010-2-6 18:07:53
sungmoo 发表于 2010-2-6 18:03
有一个难点:文件名或目录名存在空格时的处理。
我在6楼给出的代码不存在这个问题
上面的纯DOS批处理命令好像还不行

15
arlionn 在职认证  发表于 2010-2-6 18:19:19
sungmoo 发表于 2010-2-6 18:03
有一个难点:文件名或目录名存在空格时的处理。
可以用 gettoken 命令切割文件路径,然后使用 cd 命令进入指定目录。

简言之,用 stata 自有的功能处理 sungmoo 提出的问题,DOS 通配符只处理它能够实现的那些功能。

16
eblog 发表于 2010-2-6 18:23:06
arlionn 发表于 2010-2-6 18:19
sungmoo 发表于 2010-2-6 18:03
有一个难点:文件名或目录名存在空格时的处理。
可以用 gettoken 命令切割文件路径,然后使用 cd 命令进入指定目录。

简言之,用 stata 自有的功能处理 sungmoo 提出的问题,DOS 通配符只处理它能够实现的那些功能。
呵呵,让Stata把该处理的处理完,剩下的再交由Dos完成

17
sungmoo 发表于 2010-2-6 18:26:07
eblog 发表于 2010-2-6 18:23 呵呵,让Stata把该处理的处理完,剩下的再交由Dos完成
可以尝试:将stata"进行到底"。

18
eblog 发表于 2010-2-6 18:31:10
sungmoo 发表于 2010-2-6 18:26
eblog 发表于 2010-2-6 18:23 呵呵,让Stata把该处理的处理完,剩下的再交由Dos完成
可以尝试:将stata"进行到底"。
调用Dos就是想利用一些网络资源,呵呵,拿来主义嘛
Dos对目录、文件和磁盘的控制能力恰好是对Stata的一个补充!

19
eblog 发表于 2010-2-6 18:43:54
sungmoo 发表于 2010-2-6 18:26
eblog 发表于 2010-2-6 18:23 呵呵,让Stata把该处理的处理完,剩下的再交由Dos完成
可以尝试:将stata"进行到底"。



经测试,把6楼代码第16行去掉感叹号照样运行,
!copy "`x'" "`temp'"
呵呵,这样已经将stata"进行到底"了,而且修改后的代码对于不规则的文件名(包含空格等不规则字符)也可照常运行

20
sungmoo 发表于 2010-2-6 18:47:17
eblog 发表于 2010-2-6 18:43 经测试,把6楼代码第16行去掉感叹号照样运行
其实,11楼不过就是在这样的基础上加了一些控制功能。

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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-31 19:41