【问题标题】:Getting rid of BOM between SAS and R摆脱 SAS 和 R 之间的 BOM
【发布时间】: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


【解决方案1】:

根据您的链接,它看起来对我有用:

read.table('c:\\temp\\testfile.txt',fileEncoding='UTF-8-BOM',header=TRUE,sep='\t')

注意文件编码中的-BOM。

这在 r 文档中的 2.1 Variations on read.table 中。在 12 编码下,请参阅“在 UNIX 下您可能需要...”,这显然适用于现在的 Windows(至少对我而言)。

【讨论】:

  • 惊讶地发现这在 Windows 上有效,尽管有文档!
【解决方案2】:

或者您可以使用 sas 系统选项options=NOBOMFILE 写入没有 BOM 的 uft-8 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多