【问题标题】:How can I import specific files?如何导入特定文件?
【发布时间】:2019-11-06 01:10:28
【问题描述】:

我正在尝试将import美国数百个县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
}

循环似乎可以工作,但它仍然缺少从本地列表“年”中提取最大值的代码。我想使用该最大值来导入 Excel 工作表。

如何识别本地宏中的最大值,或者有没有更简单的方法来获得我想要的?

【问题讨论】:

    标签: stata stata-macros


    【解决方案1】:

    当您从第一个可能到最后一个可能循环多年时,您只需要跟踪最后一个有效年份:

    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 的答案在这种情况下是一个更简洁的解决方案。

    【讨论】:

      【解决方案2】:

      以下对我有用,效率更高:

      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 前缀(county1county2 等)开头的文件的数量,您可以使用宏在本地宏中获取每个前缀的文件名扩展功能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'"
      }
      

      如果您有大量文件,而这些文件的名称不能全部放在本地宏中,这种方法会很有用。

      【讨论】:

        【解决方案3】:

        我可以借用尼克的密码吗?

        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 循环,移动到下一个县。

        【讨论】:

          猜你喜欢
          • 2018-02-18
          • 2023-03-18
          • 1970-01-01
          • 2019-07-19
          • 1970-01-01
          • 1970-01-01
          • 2018-03-29
          • 2022-01-10
          • 2017-02-27
          相关资源
          最近更新 更多