如何标记扩展宏(local:dir)?

时间:2016-01-19 09:03:40

标签: stata tokenize stata-macros

我知道我的标题令人困惑,因为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不是字符串)。但是,我仍然想弄清楚伪代码背后的基本结构。

我如何更正我的代码并使其正常工作?

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

1 个答案:

答案 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上。

我认为这些方法中的任何一种都不比你想象的更有效(工作更快,使用更少的内存,更短的,或任何“有效”的方法)。代码显然预先假定您已正确设置文件列表。