如何导入特定文件?
How can I import specific files?
我正在尝试 import
数百个 U.S。 county xls
个文件一起在 Stata 中形成一个完整的数据集。问题是对于每个县,我都有几个不同年份的文件,所以我的文件名列表如下所示:
county1-year1970.xls
county1-year1975.xls
county2-year1960.xls
county2-year1990.xls
对于每个县,我只想要最近一年的文件(各县不同)。
到目前为止,我已经编写了代码来遍历每个可能的文件名,如果文件存在,则将年份存储在本地宏中 maxyear
:
local years = 0
forvalues i = 1/500 {
forvalues yr = 1900/2018 {
capture confirm file county`i'-year`yr'.xls
if _rc == 0 {
local years `years' `yr'
}
}
/* [code to extract the max value in `years'] */
import excel county`i'-year`maxyear'.xls, clear
}
循环似乎有效,但它仍然缺少将从本地列表“years”中提取最大值的代码。我想使用该最大值来导入 Excel sheet.
如何识别局部宏中的最大值,或者有更简单的方法来获得我想要的值吗?
以下对我有用并且效率更高:
forvalues i = 1 / 2 {
local files `: dir . files "county`i'*"'
display "`: word `: word count `files'' of `files''"
}
county1-year1975.xls
county2-year1990.xls
我在这里使用 display
命令进行说明,但您也可以使用 import
代替。
这里的想法是,如果你知道以 county
前缀(county1
、county2
等)开头的文件的数量,你就可以得到每个文件的名称使用宏扩展函数 dir
在局部宏中添加前缀。然后你只需计算那里的单词数并得到最后一个。
请注意,在这种情况下,本地宏已经按字母顺序排序。但是,更一般地,您可以使用宏扩展函数 list sort
.
对宏中的项目进行排序
例如:
local files : list sort files
以下使用mata
规避Stata本地宏中的最大字符数限制:
forvalues i = 1 / 2 {
mata: fl = sort(dir(".", "files", "county`i'*"), 1); st_local("file", fl[rows(fl)])
display "`file'"
}
如果您有大量文件,而这些文件的名称无法全部放入本地宏中,此方法将很有用。
当您从第一个可能的年份循环到最后一个可能的年份时,您只需要跟踪最后一个有效年份:
forval i = 1/500 {
local maxyear
forval yr = 1900/2018 {
capture confirm file county`i'-year`yr'.xls
if _rc == 0 local maxyear `yr'
}
if "`maxyear'" != "" {
import excel county`i'-year`maxyear'.xls, clear
}
}
换句话说,记录所有有效年份,然后找出其中的最大值,这比您需要做的工作要多。 (但请注意,随着您循环递增的年份,最大值将只是列表中的最后一项。)
这个答案很接近问题,但@Pearly Spencer 的答案在这种情况下是一个更简洁的解决方案。
我可以借用 Nick 的代码吗?
forval i = 1/500 {
foreach yr of numlist 2018(-1)1900 {
capture confirm file county`i'-year`yr'.xls
if _rc == 0 {
import excel county`i'-year`yr'.xls, clear
continue, break
}
}
}
如果这不起作用,请告诉我,因为我无法在我这边进行测试。但是,我的逻辑是从yr
中最大的数开始,找到第一个county
,然后break
循环,移动到下一个县。
我正在尝试 import
数百个 U.S。 county xls
个文件一起在 Stata 中形成一个完整的数据集。问题是对于每个县,我都有几个不同年份的文件,所以我的文件名列表如下所示:
county1-year1970.xls
county1-year1975.xls
county2-year1960.xls
county2-year1990.xls
对于每个县,我只想要最近一年的文件(各县不同)。
到目前为止,我已经编写了代码来遍历每个可能的文件名,如果文件存在,则将年份存储在本地宏中 maxyear
:
local years = 0
forvalues i = 1/500 {
forvalues yr = 1900/2018 {
capture confirm file county`i'-year`yr'.xls
if _rc == 0 {
local years `years' `yr'
}
}
/* [code to extract the max value in `years'] */
import excel county`i'-year`maxyear'.xls, clear
}
循环似乎有效,但它仍然缺少将从本地列表“years”中提取最大值的代码。我想使用该最大值来导入 Excel sheet.
如何识别局部宏中的最大值,或者有更简单的方法来获得我想要的值吗?
以下对我有用并且效率更高:
forvalues i = 1 / 2 {
local files `: dir . files "county`i'*"'
display "`: word `: word count `files'' of `files''"
}
county1-year1975.xls
county2-year1990.xls
我在这里使用 display
命令进行说明,但您也可以使用 import
代替。
这里的想法是,如果你知道以 county
前缀(county1
、county2
等)开头的文件的数量,你就可以得到每个文件的名称使用宏扩展函数 dir
在局部宏中添加前缀。然后你只需计算那里的单词数并得到最后一个。
请注意,在这种情况下,本地宏已经按字母顺序排序。但是,更一般地,您可以使用宏扩展函数 list sort
.
例如:
local files : list sort files
以下使用mata
规避Stata本地宏中的最大字符数限制:
forvalues i = 1 / 2 {
mata: fl = sort(dir(".", "files", "county`i'*"), 1); st_local("file", fl[rows(fl)])
display "`file'"
}
如果您有大量文件,而这些文件的名称无法全部放入本地宏中,此方法将很有用。
当您从第一个可能的年份循环到最后一个可能的年份时,您只需要跟踪最后一个有效年份:
forval i = 1/500 {
local maxyear
forval yr = 1900/2018 {
capture confirm file county`i'-year`yr'.xls
if _rc == 0 local maxyear `yr'
}
if "`maxyear'" != "" {
import excel county`i'-year`maxyear'.xls, clear
}
}
换句话说,记录所有有效年份,然后找出其中的最大值,这比您需要做的工作要多。 (但请注意,随着您循环递增的年份,最大值将只是列表中的最后一项。)
这个答案很接近问题,但@Pearly Spencer 的答案在这种情况下是一个更简洁的解决方案。
我可以借用 Nick 的代码吗?
forval i = 1/500 {
foreach yr of numlist 2018(-1)1900 {
capture confirm file county`i'-year`yr'.xls
if _rc == 0 {
import excel county`i'-year`yr'.xls, clear
continue, break
}
}
}
如果这不起作用,请告诉我,因为我无法在我这边进行测试。但是,我的逻辑是从yr
中最大的数开始,找到第一个county
,然后break
循环,移动到下一个县。