如何在Stata中循环遍历多个Excel文件?

时间:2014-07-11 16:47:06

标签: excel for-loop stata

这是我的代码:

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
}

我正在尝试遍历因日期不同的多个Excel文件,您可以在我放置变量date的代码中看到。例如,此电子表格的名称为Report070113,表示日期为2013年7月1日。下一次循环应导入标题为Report070213的报告。我认为最好的方法是创建一个字符串数组,这些字符串是月份的不同日期,因此我可以逐月运行代码并获取访问过不同位置的每个人的计数。我知道循环内部的工作正常,但我遇到了for循环本身的问题。当我有:

use `"`date'"'

在代码(第3行)中,它给出了以下错误:

file 01".dta not found

但是当我不包含该行时,它会给我错误:

using required

任何帮助将不胜感激;如果我的问题不清楚,请告诉我。

3 个答案:

答案 0 :(得分:1)

查看使用单引号双引号之间的区别:

clear all
set more off

local dateList "01" "02" "03" "04" "05" "06" "07" 

foreach date of local dateList {
  disp `"`date'"'
  disp "`date'"
}

问题是宏列表的第一个元素是01"而不是01。所以Stata找不到该文件。这是由于您声明宏列表然后使用双引号调用的方式。 help quotes是一个相关的读物。

对我而言,这样做会更清楚:

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
}

注意宏的声明不包含引号。现在,使用双引号或单引号的调用会产生相同的结果。为源文件创建字符串非常简单。此外,建议使用/而不是\。这使代码与其他操作系统兼容。 Stata将使其适用于MS Windows,包括在内。参考是 Stata tip 65: Beware the backstabbing backslash作者:Nicholas J. Cox。

至于using required错误,我的猜测是这与import excel期待字符串而不是代数表达式有关。在命令中添加简单的+将重现您的错误。例如:

.   import excel "V:/Report07" +
using required
r(100);

Stata不理解这个符号,所以它抱怨;它想要一些表示文件路径的字符串。 (如果您运行import excel "V:/Report07 +",则会出现不同的情况。

答案 1 :(得分:0)

尝试修改您的"导入Excel"文件路径:

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。

答案 2 :(得分:0)

我知道这已经有3年了,但我遇到了同样的问题(获得“使用必需”错误),因为我试图循环打开并修改多个Excel文件。更改目录名称中斜杠的方向修复了该问题。

class UserProfile(models.Model):

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(max_length=170, blank=True)
    avatar_url = models.CharField(max_length=256, blank=True)
    facebook_url = models.CharField(max_length=40, blank=True)
    twitter_url = models.CharField(max_length=40, blank=True)
    instagram_url = models.CharField(max_length=40, blank=True)
    web_url = models.CharField(max_length=40, blank=True)

    class Meta():
        db_table = 'auth_profile'

    def __str__(self):
        return self.user.username


@receiver(user_signed_up)
def set_initial_user_names(request, user, sociallogin=None, **kwargs):

    preferred_avatar_size_pixels = 256

    picture_url = "http://www.gravatar.com/avatar/{0}?s={1}".format(
        hashlib.md5(user.email.encode('UTF-8')).hexdigest(),
        preferred_avatar_size_pixels
    )

    if sociallogin:
        if sociallogin.account.provider == 'twitter':
            name = sociallogin.account.extra_data['name']
            user.first_name = name.split()[0]
            user.last_name = name.split()[1]

        if sociallogin.account.provider == 'facebook':
            user.first_name = sociallogin.account.extra_data['first_name']
            user.last_name = sociallogin.account.extra_data['last_name']

            picture_url = "http://graph.facebook.com/{0}/picture?width={1}&height={1}".format(
                sociallogin.account.uid, preferred_avatar_size_pixels)

        if sociallogin.account.provider == 'google':
            user.first_name = sociallogin.account.extra_data['given_name']
            user.last_name = sociallogin.account.extra_data['family_name']
            picture_url = sociallogin.account.extra_data['picture']


    profile = UserProfile(user=user, avatar_url=picture_url)
    profile.save()


@receiver(post_save, sender=User)
def create_or_update_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)
    instance.userprofile.save()

原始(失败)导入命令:

local yearlist 2014 2015

foreach year of local yearlist { 

        import....
        [do data cleaning]
        save update file
}

新(工作)导入命令:

 import excel "Z:\Data\`year'\GIS Class Data Report1_`year'.xlsx", sheet("Sheet1") firstrow clear 

我没有意识到反斜杠问题。