查看原文
其他

添加docx内容哪家强,Stata16新命令帮你忙

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:闫续文 周宏杰

文字编辑:李钊颖

技术总编:闫续文


 爬虫俱乐部将于2019年8月22日至28日湖北武汉举行为期一周的Stata编程技术定制培训,此次培训采用Stata16进行讲解,采取初级班和高级班分批次培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata软件编程、金融计量知识和实证分析方法,使大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。目前正在火热招生中~

详细培训大纲及报名方式,请点击文末阅读原文呦~


最近,为了能够第一时间为大家带来Stata16最新的命令介绍,我们团队一直没日没夜地认真研究摸索Stata16一系列的新功能。承接推文《Stata16新功能之putdocx生成页眉页脚》与《Stata16新功能——同一个文档,不一样的布局》,今天,我们继续来介绍putdocx在输出文本内容方面的新变化。

Stata15中,对于将文本内容输出到docx文件这一操作,我们主要通过putdocx text命令来完成,该命令能够直接在段落之中生成文本。然而,由于putdocx text只能将文本内容输出至现有段落,因此,对于新生成的文档来说,使用putdocx text之前必须首先通过putdocx paragraph生成段落,输出文本的操作相对繁琐且不够直接。

而现如今,Stata16的推出,为我们带来了putdocx textfileputdocx textblock这两个新命令,均可以省略掉putdocx paragraph这一中间步骤而直接生成相应的文本内容,从而进一步方便了我们输出文本到docx文件。接下来,我们就分别介绍putdocx text、putdocx textfile、putdocx textblock三个命令各自的具体用法以及相互之间的区别。


一.putdocx text

putdocx text命令用于把指定的文本内容添加到docx文件已存在的某个段落中。由于该命令已多次在往期推文中介绍且使用也较为广泛,因此,我们直接以司马光的《居洛初夏作》为例,使用putdocx text命令将其输出到docx文件中,程序如下:

clearcap mkdir E:/putdocxcd E:/putdocx! taskkill /F /IM WINWORD.EXE /Tputdocx clear //防止因内存中文档已经存在而报错putdocx begin, header(header1) footer(footer1) pagenum(lower_roman,1) pagesize(letter) landscape //新建word文档,生成名为header1的页眉和名为footer1的页脚,生成页码并设置格式为小写罗马数字、起始页码为1,设置页面大小为letter并横向布局putdocx paragraph, toheader(header1) halign(right) //生成一个段落,将该段落的内容插入到名为header1的页眉中而不再添加至正文,右对齐putdocx text ("《居洛初夏作》是宋代诗人司马光创作的一首七绝")putdocx paragraph, halign(center) //在正文中生成居中对齐的段落putdocx text ("《居洛初夏作》"), font("宋体",50,black) bold linebreak //输出文本内容,设置字体为宋体,字号为50,颜色为黑色,加粗显示,并在结尾处换行putdocx text ("四月清和雨乍晴,南山当户转分明。"), font("华文楷体",30,red) bold underline(dash) linebreak //输出文本内容,设置字体为华文楷体,字号为30,颜色为红色,加粗显示,添加虚线下划线并换行putdocx text ("更无柳絮因风起,唯有葵花向日倾。"), font("华文新魏",40,blue) //输出文本内容,设置字体为华文新魏,字号为40,颜色为蓝色putdocx paragraph, tofooter(footer1) halign(center) //生成一个段落,将段落内容插入名为footer1的页脚中,居中对齐putdocx pagenumber //该段落的内容为使用pagenum()生成的小写罗马数字页码,若在putdocx begin中未指定pagenum(),则默认为十进制数decimal格式的页码 putdocx save 居洛初夏作.docx, replaceshellout 居洛初夏作.docx

结果如下:

小结:

通过该案例,我们发现,putdocx text命令在输出文本内容的时候,有其自身独特的优势,不仅可以对字体等内容进行设置,还可以通过换行等操作调整某个段落中文本的布局。但是,缺点也相对明显,即该命令只能向已有的段落之中输出文本,对于新生成的docx文件,往往需要接在putdocx paragraph命令后才可以实现输出文本的操作,同时,该命令选项繁多琐碎,使用起来较为麻烦。


二.putdocx textfile

区别于直接在命令行中写入文本内容的putdocx text,Stata16新推出的putdocx textfile命令可以将已经写好的文本文档的内容添加至docx文件中,作用在于能够把文本文档转化成docx文件,或者将文本文档的内容添加至已经创建的docx文件内容之后,具体语句如下:

putdocx textfile textfile [, append stopat(string [, stopatopt])]

其中第二个textfile代表的是所要添加至docx文件的目标文本文档名称,putdocx textfile命令有如下选项:

1append:将目标文本文档中的内容添加至docx文件中已经存在的段落内容后面,默认情况下将会生成新的段落。

2stopat(string[, stopatopt]):只保留文本文档中指定字符串string所在行之前的内容。stopatopt 可以设置为begincontainend。若指定字符串string出现在行首,则设置begin,若在行中,则设置为contain,若在行末,则设置为end。默认为begin

接下来,我们仍然以《居洛初夏作》为例,首先创建文本文档,程序如下:

file open myfile using example.txt, write replace //创建一个名为example的文本文档file write myfile "《居洛初夏作》" _nfile write myfile "四月清和雨乍晴," _nfile write myfile "南山当户转分明。" _nfile write myfile "更无柳絮因风起," _nfile write myfile "唯有葵花向日倾。" _n //写入《居洛初夏作》内容并换行file close myfile 

example.txt的内容如下:

接下来,我们使用putdocx textfile命令将该文本文档的全部内容以及部分节选内容添加到docx文件中,程序如下:

putdocx clearputdocx begin putdocx pagebreakputdocx textfile example.txt //默认在docx文档中生成新的段落并将example.txt的全部内容输出到该段落putdocx textfile example.txt, stopat("南山",begin) //默认在docx文档中生成新的段落并指定需要输出的内容截止“南山”所在行之前putdocx textfile example.txt, stopat("柳絮",contain) //默认在docx文档中生成新的段落并指定需要输出的内容截止“柳絮”所在行之前putdocx textfile example.txt, stopat("倾。",end) //默认在docx文档中生成新的段落并指定需要输出的内容截止“倾。”所在行之前putdocx textfile example.txt, append //将example.txt的全部内容输出到当前docx文件中已存在的段落之中putdocx save 居洛初夏作.docx, append shellout 居洛初夏作.docx

此时新生成的docx中内容如下:

我们发现,原始的example.txt并没有出现中文乱码,而当我们使用putdocx textfile命令将文本文件的内容输出到docx文件中时,却出现了中文乱码的情况。为了解决这一问题,我们首先打开“居洛初夏作.docx”查看该文件对应的编码,点击“文件”-“选项”:

在弹出的Word选项对话框“高级”-“常规”中,点击“Web选项”:

在Web选项对话框的“编码”中,我们看到,当前的docx文档是gb18030的编码:

因此,我们可以通过ustrto()函数将文本文档内容的编码转换为gb18030编码后,再将其输出到docx文件中(有关ustrto()函数的用法详见推文《ustrto函数将RTF中文乱码打回原形》),程序如下:

file open myfile using example.txt, write replacefile write myfile `"`=ustrto("《居洛初夏作》", "gb18030", 1)'"' _n file write myfile `"`=ustrto("四月清和雨乍晴,", "gb18030", 1)'"' _nfile write myfile `"`=ustrto("南山当户转分明。", "gb18030", 1)'"' _nfile write myfile `"`=ustrto("更无柳絮因风起,", "gb18030", 1)'"' _nfile write myfile `"`=ustrto("唯有葵花向日倾。", "gb18030", 1)'"' _nfile close myfileputdocx clearputdocx begin putdocx pagebreakputdocx textfile example.txt //默认在docx文档中生成新的段落并将example.txt的全部内容输出到该段落putdocx textfile example.txt, stopat("南山",begin) //默认在docx文档中生成新的段落并指定需要输出的内容截止“南山”所在行之前putdocx textfile example.txt, stopat("柳絮",contain) //默认在docx文档中生成新的段落并指定需要输出的内容截止“柳絮”所在行之前putdocx textfile example.txt, stopat("倾。",end) //默认在docx文档中生成新的段落并指定需要输出的内容截止“倾。”所在行之前putdocx textfile example.txt, append //将example.txt的全部内容输出到当前docx文件中已存在的段落之中putdocx save 居洛初夏作.docx, append shellout 居洛初夏作.docx 

结果如下:

此时,中文乱码的问题得到了解决。

小结:

通过上述内容,我们可以发现,putdocx textfile命令的用法十分简洁,可以帮助我们直接将已有文本文档的内容输出到docx文件中,并且可以根据用户需求指定输出某一字符串所在行之前的内容。虽然有着易于上手这一显著的优势,但是putdocx textfile命令不能设置字体本身的各项特征,只能输出为固定样式。


三.putdocx textblock

与putdocx text输出文本设定繁琐、putdocx textfile只能输出固定的文本文档内容相比,putdocx textblock命令通过模拟word输入环境,便捷地添加所需文本内容至docx文件中。该命令主要通过两种组合输出文本内容:

(1)putdocx textblock begin与putdocx textblock end:向docx文件中添加新的段落并输出文本内容。

(2)putdocx textblock append与putdocx textblock end:向docx文件中已有的段落输出文本内容。

我们仍然以《居洛初夏作》为例,使用putdocx textblock命令将其输出到docx文档中,程序如下:

putdocx clearputdocx begin putdocx textblock begin //模拟word输入环境《居洛初夏作》四月清和雨乍晴,南山当户转分明。更无柳絮因风起,唯有葵花向日倾。putdocx textblock end //结束putdocx save 居洛初夏作.docx, append shellout 居洛初夏作.docx

然而,我们发现,Stata的程序虽然没有报错,却停在了putdocx textblock begin这一步:

这里有一点需要大家注意,在putdocx textblock end后面加入任何注释都会导致该结束命令无效,从而无法执行后续命令。因此,我们删除putdocx textblock end后面的注释,重新输出文本内容,程序如下:

putdocx clearputdocx begin putdocx textblock begin //模拟word输入环境《居洛初夏作》四月清和雨乍晴,南山当户转分明。更无柳絮因风起,唯有葵花向日倾。putdocx textblock endputdocx paragraph, halign(center) font("华文楷体",20,blue)putdocx textblock append《居洛初夏作》putdocx textblock endputdocx paragraph, halign(center) font("宋体",15,green)putdocx textblock append四月清和雨乍晴,南山当户转分明。更无柳絮因风起,唯有葵花向日倾。putdocx textblock endputdocx save 居洛初夏作.docx, append shellout 居洛初夏作.docx

输出的docx内容如下所示:

我们发现,由于putdocx textblock begin模拟了word输入环境,此时输入任何字符均不需要使用双引号,任何转义字符或者命令也都是无效的,Stata只会将这些内容识别为单纯的字符串从而将其输出到docx文件中。与此同时,文本中的换行也是无效的。

小结:

从输出结果我们可以看出,putdocx textblock命令能够帮助我们更加快捷地输出文本内容,但是putdocx textblock begin和putdocx textblock end这一对组合在输出文本时存在无法调整段落与字体格式,且文本内的换行操作无效等问题,而putdocx textblock append和putdocx textblock end这一对命令虽然可以调整段落样式,但仍然需要首先使用putdocx paragraph命令生成段落。


至此,本文介绍了putdocx text、 putdocx textfile、putdocx textblock三个命令,它们有着各自的优缺点,我们可以根据自己的需要灵活地选择。作为Stata16的新命令,putdocx textfile与putdocx textblock均优化了输出的速度,却缺少了可选项,我们期待以后这些新命令可以发展得更加人性化。大家赶快去尝试一下这些命令吧。

对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!

往期推文推荐

        将数值型计算“一网打尽”——(1)

        将数值型计算“一网打尽”——(2)

         Stata16新功能之“框架”——读入多个数据集(1)

 Stata16新功能——同一个文档,不一样的布局

 手持Python,斗图不输!

 万般进制千机变,Python一计乾坤定——利用Python来进行进制转换

        朝花夕拾——cnstock与cntrade强强联合

关于我们

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


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

投稿邮箱:statatraining@163.com

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

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存