Stata 如何自动为宏分配最大数量的字符串?
我的问题的标题可能有点模棱两可 以前,我想“获取子目录的完整列表”,然后将这些子目录中的文件读入Stata(请参阅和) 多亏了@Roberto Ferrer的伟大建议,我几乎做到了这一点。但当时我遇到了另一个问题。因为我有这么多单独的文件,所以本地宏的长度似乎达到了上限。在命令Stata 如何自动为宏分配最大数量的字符串?,stata,stata-macros,Stata,Stata Macros,我的问题的标题可能有点模棱两可 以前,我想“获取子目录的完整列表”,然后将这些子目录中的文件读入Stata(请参阅和) 多亏了@Roberto Ferrer的伟大建议,我几乎做到了这一点。但当时我遇到了另一个问题。因为我有这么多单独的文件,所以本地宏的长度似乎达到了上限。在命令local n:word countStata发送错误消息后: 宏替换导致行太长 替换宏产生的行将超过允许的长度。允许的最大长度为645216个字符,根据set maxvar计算。您可以在Stata/SE和Stata/MP
local n:word count
Stata发送错误消息后:
宏替换导致行太长
替换宏产生的行将超过允许的长度。允许的最大长度为645216个字符,根据set maxvar计算。您可以在Stata/SE和Stata/MP中进行更改。以下内容仅在您使用Stata/SE或Stata/MP时相关
最大行长度定义为比最大宏长度(当前为645200个字符)多16个字符。set maxvar每增加一个单位,长度最大值就会增加129。set maxvar的最大值为32767。因此,如果将maxvar设置为其最大值,则最大行长度可以设置为4227159个字符
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
}
多谢各位 不需要在宏中存储整个文件列表<代码>文件列表创建要使用的文件数据库。只需保存它,然后为要处理的每个文件重新加载它。您还使用了一种非常低效的方法来附加数据集。随着附加数据集的增长,重新加载和保存数据集的成本变得非常高,可能会将整个过程拖慢到爬行 下面是如何处理Excel文件的示意图
filelist, directory(".") pattern(*.xlsx)
save "myfiles.dta", replace
local n = _N
forval i = 1/`n' {
use in `i' using "myfiles.dta", clear
local f = dirname + "/" + filename
qui import excel using "`f'",clear
tempfile res`i'
save "`res`i''"
}
clear
forval i = 1/`n' {
append using "`res`i''"
}
save "final.dta", replace
不需要将整个文件列表存储在宏中<代码>文件列表创建要使用的文件数据库。只需保存它,然后为要处理的每个文件重新加载它。您还使用了一种非常低效的方法来附加数据集。随着附加数据集的增长,重新加载和保存数据集的成本变得非常高,可能会将整个过程拖慢到爬行 下面是如何处理Excel文件的示意图
filelist, directory(".") pattern(*.xlsx)
save "myfiles.dta", replace
local n = _N
forval i = 1/`n' {
use in `i' using "myfiles.dta", clear
local f = dirname + "/" + filename
qui import excel using "`f'",clear
tempfile res`i'
save "`res`i''"
}
clear
forval i = 1/`n' {
append using "`res`i''"
}
save "final.dta", replace
很抱歉延迟回复。谢谢你,罗伯特·皮卡德,你的方法非常有效。还有一件事需要注意,如果有人想像我一样导入大量文件:您最好在命令之前添加
cap noi
,以防止do fileSorry因延迟回复而意外终止。谢谢你,罗伯特·皮卡德,你的方法非常有效。还有一件事需要注意,如果有人想像我一样导入大量文件:最好在命令之前添加capnoi
,以防止do文件意外终止