我知道我的标题令人困惑,因为tokenize
命令被指定为一个字符串。
我有许多文件夹,其中包含大量、独立的、命名不当的 Excel 文件(其中大部分是从网站上抓取的)。手动选择不方便,需要依赖Stata扩展宏功能local :dir
阅读它们。
我的代码如下所示:
foreach file of local filelist {
import excel "`file'", clear
sxpose, clear
save "`file'.dta", replace
}
这样的代码会生成很多新的dta
文件,因此目录中充满了这些文件。我更喜欢首先创建一个新的数据文件xlsx
文件,然后append
其他人到它里面foreach
环形。所以本质上,有一个if-else
循环内。
我们需要宏的索引filelist
刚刚创建,这样我们就可以编写如下内容:
token `filelist' // filelist is created in the former code
if "`i'" == `1' {
import excel "`file'",clear
}
else {
append using `i',clear
}
我知道我的代码效率低下且容易出错:表达式的语法token 'filelist'
也是不正确的(鉴于filelist
不是字符串)。然而,我仍然想弄清楚我的伪代码背后的基本结构。
我怎样才能纠正我的代码并使其正常工作?
另一种更有效的方法受到高度欢迎。
我想到了各种技术,但没有一种技术需要标记化。
local count = 1
foreach file of local filelist {
import excel "`file'",clear
sxpose, clear
if `count' == 1 save alldata
else append using alldata
local ++count
}
local allothers "*"
foreach file of local filelist {
import excel "`file'",clear
sxpose, clear
`firstonly' save alldata
`allothers' append using alldata
local firstonly "*"
local allothers
}
在第二个块中,要点是前缀为的行*
被视为注释,因此任何命令*
前面的内容被忽略(“注释掉”)。这append
语句在循环中第一次被注释掉save
语句前面有一个未定义的本地宏,其计算结果为空字符串,因此它是not被忽略。
第一次循环后,注释掉append
被移除,但放置在save
.
我不认为这两种方法比你想象的更有效(工作更快,使用更少的内存,更短,或者任何“高效”对你意味着什么)。该代码显然预先假定您已正确设置文件列表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)