温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
作者:连玉君 (中山大学)
E-Mail: arlionn@163.com
目录
今天在编写 GTALabel.ado
小程序时遇到了一个问题,分享一下我的解决思路。
这个问题困扰我好几天了,没心思干别的事情。
问题: Windows 系统的 txt 文件在使用 utf-8 编码保存时会默认在文件开头插入三个不可见的字符:0xEF 0xBB 0xBF,称为 BOM 头。 对此问题的详细讨论参见 「Windows文本文件编码」
其间,一度想偷懒询问 Stata 公司的老大哥 Peng Hua 博士,或是 Boston College 的 Baum 教授,也想到了李春涛和王群勇。询问之前,我需要把我的问题说清楚。于是,做了一个极简的例子 (下面会看到),然后把我能做的各种尝试都写在里面,让他们知道我实在是不得已才麻烦他们的。
首先是在 Stata List 论坛里搜索,关键词包括:txt BOM,import delimited 等。唯一一篇相关的帖子虽然涉及到了这个问题,但并未给出解决方法:「Cannot destring numbers--hidden characters? - Statalist」 。
无奈这下,只好扩大搜索范围。
就读取 txt 文件而言,其他软件也存在相似的问题,例如,python 读取带 BOM 的 utf-8 格式文件。
也有人提到了 DOS 下的批处理命令:批处理命令下如何删除utf-8编码的txt文本的bom头?
Windows 系统的 txt 文件在使用 utf-8 编码保存时会默认在文件开头插入三个不可见的字符:0xEF 0xBB 0xBF
,称为 BOM 头。
打开 txt 文档无法看到这三个字符,第一行的首字母也是左边对齐的:
用 import delimited
导入 Stata 后似乎看不出问题,因为数据浏览窗口是看不到隐藏字头 BOM 的:
. import delimited "abc.txt", encoding(utf8) clear // UTF-8 编码
. format v %-5s
. browse
事实上,这个 BOM 虽然是隐藏字符,但却是占位置的:上图中的两个「伪空格」占了三个字母 (= 5-2) 的位置。
. gen numb = length(v) //字符个数统计
. list v numb, clean noobs
. import delimited "abc.txt", encoding(Cp1252) clear // Windows Latin-1
. format v %-5s
. list v, clean noobs
结果如下:
事实上,上述代码的思路是没有问题的,只是对于 BOM 头文字的编码顺序设定有误,同时,还需要考虑你的编码是 UTF-8
,UTF-16
还是 UTF-32
。如下代码最终解决了我的问题:
// drop BOM characters (byte order marks)
tempfile filesource_noBOM
filefilter `"`filesource_temp'"' `"`filesource_noBOM'.txt"', from("\EFh\BBh\BFh") to("") replace
主要参考了如下资料:
help import delimited
]
连享会-直播课 上线了!
http://lianxh.duanshu.com
免费公开课:
直击面板数据模型 - 连玉君,时长:1小时40分钟 Stata 33 讲 - 连玉君, 每讲 15 分钟. 部分直播课 课程资料下载 (PPT,dofiles等)
支持回看,所有课程可以随时购买观看。
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 ⭐ | DSGE, 因果推断, 空间计量等 | |
⭕ Stata数据清洗 | 游万海 | 直播, 2 小时,已上线 |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会学习群-常见问题解答汇总:
✨ https://gitee.com/arlionn/WD