如何在Stata中循环多个Excel文件?
这里是我有的代码:
local dateList "01" "02" "03" "04" "05" "06" "07" foreach date of local dateList { use `"`date'"' clear import excel "V:\Report07" + `"`date'"' + "13.xls", sheet("MySheet") firstrow sort PersonID Place bysort PersonID (Place): gen mix = Place[1] != Place[_n] sort PersonID by PersonID: egen anymix=max(mix) count if anymix==1 drop mix drop anymix }
我试图循环通过date不同的多个Excel文件,正如你可以在代码中看到的那样放置variablesdate
。 例如,此电子表格的名称为Report070113
,表示2013年7月1日。下次通过循环导入报告名为Report070213
。 我认为这样做的最好方法是创build一个string数组,这个月份的各个date,所以我可以每月运行代码,并获得每个访问过不同地方的人数。 我知道什么是在循环内工作正常,但我有麻烦的for循环本身。 当我有:
use `"`date'"'
在代码(第3行),它给我以下错误:
file 01".dta not found
但是,当我不包括这一行,它给了我这个错误:
using required
任何帮助,将不胜感激; 如果我的问题不清楚,请告诉我。
查看使用单引号和双引号之间的区别:
clear all set more off local dateList "01" "02" "03" "04" "05" "06" "07" foreach date of local dateList { disp `"`date'"' disp "`date'" }
问题是macros列表的第一个元素是01"
而不是01
,所以Stata找不到这个文件,这是由于你声明macros列表的方式,然后用双引号调用。一个相关的阅读在这里。
对我来说,这样做更清楚:
clear all set more off local dateList 01 02 03 04 05 06 07 foreach date of local dateList { disp `"`date'"' disp "`date'" display "V:/Report07`date'13.xls" * This should work for you (uncomment) *import excel "V:/Report07`date'13.xls", sheet("MySheet") firstrow }
请注意macros的声明不包含引号。 现在使用双引号或单引号可以得到相同的结果。 为源文件创buildstring很简单。 另外,build议是使用/
而不是\
。 这使得代码跨其他操作系统兼容。 Stata将使它适用于MS Windows,包括在内。 参考是Stata提示65:谨防 Nicholas J. Cox 的背刺反斜杠 。
至于using required
错误,我的猜测是这与import excel
期待一个string而不是一个代数expression式 。 给命令添加一个简单的+
会重现你的错误。 例如:
. import excel "V:/Report07" + using required r(100);
Stata不理解符号,所以它抱怨; 它想要一些代表文件path的string。 (如果运行import excel "V:/Report07 +"
,则会发生不同的情况。
尝试修改您的“导入excel”文件path:
local dateList "01" "02" "03" "04" "05" "06" "07" foreach date of local dateList { clear import excel "V:\Report07\`date'13.xls", sheet("MySheet") firstrow sort PersonID Place bysort PersonID (Place): gen mix = Place[1] != Place[_n] sort PersonID by PersonID: egen anymix=max(mix) count if anymix==1 drop mix drop anymix }
如果仍然要求“使用所需”,那么请尝试“使用…导入excel”。