【发布时间】:2014-04-28 20:55:49
【问题描述】:
我使用 SAS 在 Windows 机器上保存一个以utf8 编码的制表符分隔的文本文件。然后我尝试在 R 中打开它:
read.table(myfile, header =TRUE, sep = "\t")
令我惊讶的是,数据完全混乱,但只是偷偷摸摸的。数值随机变化,但整体布局看起来很正常,所以我花了一段时间才注意到问题,我现在假设是BOM。
这当然不是新问题;他们简短地解决了here,并建议使用
read.table(myfile, fileEncoding = "UTF-8", header =TRUE, sep = "\t")
但是,这并没有改善!我唯一的解决方案是抑制标题,无论是否带有fileEncoding 参数:
read.table(myfile, fileEncoding = "UTF-8", header =FALSE, sep = "\t")
read.table(myfile, header =FALSE, sep = "\t")
在任何一种情况下,我都必须做一些有趣的事情来用第一行替换列名,但前提是我删除了出现在第一列名开头的一些 BOM 版本(<U+FEFF> 如果我使用fileEncoding 和
 如果我不使用 fileEncoding)。
难道没有一种简单的方法可以删除 BOM 并使用 read.table 而不使用任何特殊参数吗?
@Joe 更新: 我使用的 SAS:
FILENAME myfile 'C:\Documents ... file.txt' encoding="utf-8";
proc export data=lib.sastable
outfile=myfile
dbms=tab replace;
putnames=yes;
run;
更怪异的更新: 使用@Joe 在下面的解决方案中建议的fileEncoding="UTF-8-BOM" 似乎可以删除 BOM。 但是,它并没有解决我最初的动机问题,即数据损坏;标题行很好,但奇怪的是第一列数字的最后几位数字被弄乱了。我会感谢乔的回答——也许我的问题实际上不是 BOM 问题?
破解解决方案:使用fileEncoding="UTF-8-BOM" 并且还包括参数colClasses = "character"。不知道为什么这可以解决数据损坏问题 - 可能是未来问题的主题。
【问题讨论】:
-
你是如何在 SAS 中写出文件的?
-
@Joe,查看问题更新。
-
我认为 UTF-8 是不可协商的,并且 不是 SAS 会话的编码?
-
@Joe,好点子。编码的选择是完全可以协商的。事实上,我试图找出哪种编码最适合将东西导入 R,但失败了。你有推荐吗? (我不确定如何检查“我的 SAS 会话”的编码,尽管至少有一个对“wlatin1”的引用)
标签: r sas byte-order-mark