楼主: dxystata
10222 21

[讨论]如何得到当前数据集所在的路径 [推广有奖]

11
sungmoo 发表于 2010-1-20 12:31:16
*或者
di reverse(substr(reverse(c(filename)),1+strpos(reverse(c(filename)),"\"),.))
di reverse(substr(reverse(c(filename)),strpos(reverse(c(filename)),"\"),.))

12
eblog 发表于 2010-1-20 12:52:47
sungmoo 发表于 2010-1-20 12:17
*试一下
di substr(c(filename),1,length(c(filename))-strpos(reverse(c(filename)),"\"))
di substr(c(filename),1,1+length(c(filename))-strpos(reverse(c(filename)),"\"))
这种方法对于相对路径打开的文件似乎无效:

. use D:\stata\Stata11\ado\base\a\auto.dta, clear //绝对路径
(1978 Automobile Data)
. di substr(c(filename),1,length(c(filename))-strpos(reverse(c(filename)),"\"))
D:\stata\Stata11\ado\base\a
.
. di substr(c(filename),1,1+length(c(filename))-strpos(reverse(c(filename)),"\"))
D:\stata\Stata11\ado\base\a\

. cd D:\stata\Stata11\ado\base\a
D:\stata\Stata11\ado\base\a
. use auto, clear //相对路径
(1978 Automobile Data)
. di substr(c(filename),1,length(c(filename))-strpos(reverse(c(filename)),"\"))
auto.dta
.
. di substr(c(filename),1,1+length(c(filename))-strpos(reverse(c(filename)),"\"))
auto.dta
. di reverse(substr(reverse(c(filename)),1+strpos(reverse(c(filename)),"\"),.))
auto.dta
.
. di reverse(substr(reverse(c(filename)),strpos(reverse(c(filename)),"\"),.))
.

13
eblog 发表于 2010-1-20 12:56:54
4楼给出方法对相对路径打开的文件也是适用的:

. cd D:\stata\Stata11\ado\base\a
D:\stata\Stata11\ado\base\a

. use auto, clear
(1978 Automobile Data)

. qui findfile auto.dta

. local fn=r(fn)

. qui _getfilename auto.dta

. local filename=r(filename)

. di subinstr("`fn'","`filename'","",.)
D:\stata\Stata11\ado\base/a/

14
sungmoo 发表于 2010-1-20 20:42:23
eblog 发表于 2010-1-20 12:52 这种方法对于相对路径打开的文件似乎无效
*可以嵌套c(pwd):

di cond(strpos(c(filename),"\"),reverse(substr(reverse(c(filename)),1+strpos(reverse(c(filename)),"\"),.)),c(pwd))

15
eblog 发表于 2010-1-21 09:55:35
sungmoo 发表于 2010-1-20 20:42
eblog 发表于 2010-1-20 12:52 这种方法对于相对路径打开的文件似乎无效
*可以嵌套c(pwd):

di cond(strpos(c(filename),"\"),reverse(substr(reverse(c(filename)),1+strpos(reverse(c(filename)),"\"),.)),c(pwd))
还是有问题

. cd d:\
d:\

. sysuse auto, clear
(1978 Automobile Data)

. di cond(strpos(c(filename),"\"),reverse(substr(reverse(c(filename)),1+strpos(reverse(c(filename)),"\"),.)),c(pwd))
D:\stata\Stata11\ado

. di c(filename)
D:\stata\Stata11\ado\base/a/auto.dta

16
sungmoo 发表于 2010-1-21 10:14:12
eblog 发表于 2010-1-21 09:55
. di c(filename)
D:\stata\Stata11\ado\base/a/auto.dta
也就是说,你的目录名中用到了"/"?

17
eblog 发表于 2010-1-21 10:27:00
sungmoo 发表于 2010-1-21 10:14
eblog 发表于 2010-1-21 09:55
. di c(filename)
D:\stata\Stata11\ado\base/a/auto.dta
也就是说,你的目录名中用到了"/"?
自动出来的,也不知道是怎么回事

18
eblog 发表于 2010-1-21 10:29:22
你的“定位截取”思路改成“直接替换”是否会好一些?

19
sungmoo 发表于 2010-1-21 10:33:11
*考虑到在windows中stata实际上不区分"\"与"/",可采用(事实上仍可把两步并成一步,但命令太长)
loc c=subinstr(c(filename),"/","\",.)
n di cond(strpos("`c'","\"),reverse(substr(reverse("`c'"),1+strpos(reverse("`c'"),"\"),.)),c(pwd))
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Stakiny + 3 + 3 + 3 精彩帖子

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

20
sungmoo 发表于 2010-1-21 10:39:01
c(filename)的值由最近的use决定,而c(pwd)的值由最近的cd决定。因此,若想以“默认目录”的方式(即只输入"use 文件名.dta"的方式)打开dta,并使用上述显示目录的命令,最近的cd应在最近的use之前。
已有 1 人评分论坛币 收起 理由
dxystata + 20 好的意见建议

总评分: 论坛币 + 20   查看全部评分

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

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