有问必答 | 如何将文件名变为文件中的一个变量

2017-06-06 高娜娜 爬虫俱乐部 爬虫俱乐部

近日,爬虫俱乐部的一位铁粉给小编发邮件,说他从wind数据库里下载的上市公司数据不包含股票代码,而下载下来的excel文件名是相应的股票代码,问有没有什么办法可以将excel文件的文件名变为excel文件中的一个变量,最后再将这些数据合并到一起。

让我们来瞄瞄具体问题。

这是我们需要添加股票代码的excel文件。

我们先用import命令将000049.xlsx文件读入stata,看看具体的数据结构是什么样的。

import excel using 000049.xlsx,first clear

读 入后的结果如下图,其中有一个需要注意的地方是,在数据的结尾处,有一行空格和一行“数据来源:Wind咨询”,这是Wind数据的特有格式,虽然这两行 不影响我们对单个数据的处理,但会对后续的数据追加产生影响,而且这两行内容也是我们不需要的,所以我们先将这两行删掉,在这里,我们使用drop命令。

drop in -2/-1

下 面就是最主要的部分了,即产生股票代码变量,股票代码是在文件名里,如何让stata智能的记住文件名并引用文件名呢?这就要用到我们在推文《赐予我力量 吧,stata!》里介绍到的fs命令,这个命令的作用是列出某一文件夹下文件的名字,当然,我们也可以只列出指定类型的文件。

以000049.xlsx为例。

fs 000049.xlsx

文件名虽然列出来了,但是还不够,问题的关键是我们如何引用文件名,不过这也不是什么大大问题,因为fs命令在列出文件名的同时会自动将文件名存在返回值里,我们只需要引用fs命令的返回值r(files)就可以了。

return list

gen code = r(files)

因为返回值r(files)里的文件名是包含文件的后缀的,所以将文件名生成股票代码后,还需要做一个小小的处理,即只将文件名中的股票代码保存下来,在这里我们可以用substr()函数。

replace code=substr(code,1,6)

既然对000049.xlsx文件我们会处理了,那对于其他的excel文件,只需要写个循环批量处理,然后将新生成的dta文件追加在一起就OK了。

话不多说,直接将完整的代码奉送给大家。

clear

set more off

cd D:\2012

fs *.xlsx

foreach file in `r(files)' {

  import excel using "`file'",first clear

  drop in -2/-1

  gen code = "`file'"

  replace code=substr(code,1,6)

  save `file'.dta,replace

}

clear

cd D:\2012

local files:dir "D:\2012" files "*.dta"

foreach file in `files'{

   append using "`file'",force

}

save mydata.dta,replace

这样,我们想要的股票代码就有了,所有的数据也都合并在一起了。我们的这位铁粉给小编指出,小编在使用了第一次循环后没有clear,导致其中一个文件被append了两次。在此,爬虫君特地提醒大家,批量append之前记得先clear哦。

在上述方法中,虽然我们达到了预定的目的,但还有更简洁更高效的办法,那就是使用openall命令,在推文《送你一只粘合剂——用openall合并数据》 中详细介绍了这个命令。在批量将excel文件转成dta文件,并批量对dta文件做过预处理后,直接使用openall命令,不需在openall之前 先clear,而且openall命令的storefilename()选项可以生成一个新的变量,显示某条观测值的来源文件。

先用代码批量对excel文件和转化后的dtta文件做预处理。

cd D:\2012

fs *.xlsx

foreach file in `r(files)' {

  import excel using "`file'",first clear

  drop in -2/-1

  save `file'.dta,replace

}

然后使用openall命令以及storefilename()选项

openall *,storefilename(code)

将code变量中需要的部分提取出来

replace code=substr(code,1,6)

呐,大功告成,这种方法是不是更简洁更高效呢?

以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。

应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~

                     文字编辑:梅洁瓷傲

技术总编:刘贝贝



往期推文推荐:

1.高校学术大神:你的导师上榜了吗?

2.中国高校财经、管理与综合类期刊灌水排行榜

3.关于RTF你不知道的命令之番外篇

4.免费事件研究,一片片从邮局寄来

5.免费的股价同步性,一片片从邮局寄来

6.Stata叫你回家听音乐了!

7.一言不合就用stata写邮件(Outlook/Foxmail)

8.听说你想知道怎么用stata画地图?

9.I have a Stata, I have a python

10.I have a Stata, I have a Python之二——pdf转word




关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

欢迎关注爬虫俱乐部

微信扫一扫
关注该公众号