我的问题的标题可能有点模棱两可。
以前,我想“获取完整的子目录列表”,然后将这些子目录中的文件读入 Stata(参见这篇文章和这篇文章)。
感谢@Roberto Ferrer 的好建议,我几乎做到了。但那时我遇到了另一个问题。因为我有这么多单独的文件,本地宏的长度似乎达到了上限。命令local n: word count
Stata发送错误消息后:
宏替换导致行太长。
替换宏产生的行将比允许的长。最大允许长度为 645,216 个字符,根据 set maxvar 计算得出。您可以在 Stata/SE 和 Stata/MP 中更改它。以下内容仅在您使用 Stata/SE 或 Stata/MP 时相关。
最大行长度定义为比最大宏长度大 16,目前为 645,200 个字符。set maxvar 每增加一个单位,长度最大值就会增加 129。set maxvar 的最大值为 32,767。因此,如果将 maxvar 设置为其最大值,则最大行长度可能设置为 4,227,159 个字符。
r(920);
当我将子目录的数量减少到 5 个时,Stata 工作正常。由于大约有 100 个子目录,我想复制这些操作 20 次。好吧,它是可以管理的,但我还是想知道我是否可以完全自动化这个过程,更具体地说,“用尽”最大允许的宏长度,导入文件并下次添加另一组子目录。
您可以在下面找到我的代码:
//====================================
//=== read and clean projects data ===
//====================================
version 14
set linesize 80
set more off
clear
macro drop _all
set linesize 200
cd G:\Data_backup\Soufang_data
*----------------------------------
* Read all files within dictionary
*----------------------------------
* Import the first worksheets 1:"项目首页" 2:"项目概况" 3:"成交详情"
* worksheet1
filelist, directory("G:\Data_backup\Soufang_data") pattern(*.xlsx)
* Add pattern(*.xlsx) provent importing add file type( .doc or .dta)
gen tag = substr(reverse(dirname),1,6) == "esuoh/"
keep if tag==1
gen path = dirname+"\"+filename
qui valuesof path if tag==1
local filelist = r(values)
split dirname, parse("\" "/")
ren dirname4 citylist
drop dirname1-dirname3 dirname5
qui valuesof citylist if tag==1
local city = r(values)
local count = 1
local n:word count `filelist'
forval i = 1/`n' {
local file : word `i' of `filelist'
local cityname: word `i' of `city'
** don't add xlsx after `file', suffix has been added
** write "`file'" rather than `file', I don't know why but it works
qui import excel using "`file'",clear
cap qui sxpose,clear
cap qui drop in 1/1
gen city = "`cityname'"
if `count'==1 {
save house.dta,replace emptyok
}
else {
qui append using house
qui save house.dta,replace emptyok
}
local ++count
}
谢谢你。