0

我知道我的标题在tokenize命令被指定为字符串的意义上令人困惑。

我有许多文件夹,其中包含大量、分离、名称错误的 Excel 文件(其中大部分是从 ahe 网站上抓取的)。手动选择不方便,需要依靠Stata扩展宏功能local :dir来读取。

我的代码如下所示:

foreach file of local filelist {
    import excel "`file'", clear
    sxpose, clear 
    save "`file'.dta", replace
}

这样的代码将生成许多新dta文件,因此目录中充满了这些文件。我更喜欢为第一个文件创建一个新的数据文件xlsx,然后appendforeach循环内创建其他文件。所以本质上,有一个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不是字符串)。但是,我仍然想弄清楚我的伪代码背后的基本结构。

我怎样才能更正我的代码并使其工作?

另一种更有效的方法受到高度欢迎。

4

1 回答 1

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.

我认为这两种方法中的任何一种都不会比您想象的更有效(工作速度更快,使用更少的内存,更短,或者任何“高效”对您来说意味着什么)。该代码显然确实预设了您已正确设置文件列表。

于 2016-01-19T11:11:08.350 回答