我知道我的标题令人困惑,因为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
不是字符串)。但是,我仍然想弄清楚伪代码背后的基本结构。
我如何更正我的代码并使其正常工作?
另一种更有效的方法受到高度欢迎。
答案 0 :(得分:1)
我想到了各种技术,其中没有一种需要进行标记化。
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
语句前面有一个未定义的本地宏,其值为空字符串,因此忽略 。
第一次循环后,append
上的评论被删除,但被放置在save
上。
我认为这些方法中的任何一种都不比你想象的更有效(工作更快,使用更少的内存,更短的,或任何“有效”的方法)。代码显然预先假定您已正确设置文件列表。