使用BOM读取UTF-8编码的文本文件

21

我有一个带有字节顺序标记(U+FEFF)开头的文本文件,我想在R中读取该文件。有没有办法避免字节顺序标记?

data.table包中的fread函数可以读取该文件,但会在第一个变量名的开头添加ļ»æ


> names(frame_pers)[1]
[1] "ļ»æreg_date"

对于read.csv函数也是一样的。

目前我已经编写了一个函数,可以删除第一列列名中的BOM,但我相信应该有一种自动去除BOM的方法。

remove.BOM <- function(x) setnames(x, 1, substring(names(x)[1], 4))

> names(frame_pers)[1]
[1] "ļ»æreg_date"
> remove.BOM(frame_pers)
> names(frame_pers)[1]
[1] "reg_date"

我正在使用 R 会话的本地编码:

> options("encoding" = "")
> options("encoding")
$encoding
[1] ""
3个回答

30
你尝试过使用read.csv(..., fileEncoding = "UTF-8-BOM")吗?根据?file的说法:
自 R 3.0.0 版本开始,支持编码‘"UTF-8-BOM"’,如果存在字节顺序标记(BOM),则会被移除(这在由微软应用生成的文件和网页中往往存在 BOM)。

2
对我也不起作用。 我的原始数据在从notepad ++复制粘贴时看起来像“31.1”,但是在R中使用fread时会分成2列,并且使用read.csv时,我得到以下前缀“”(使用as.is = TRUE)。 我使用autohotkey和convert2txt从gui显示获取ocr,并将其写入文件。 这使我遇到了问题,“31.2”变成了“ .331”。 - EngrStudent

7

这个问题在1.9.6版本和1.9.8版本之间得到了解决,通过此次提交;更新你的data.table安装即可修复此问题。

完成后,您只需要使用fread

fread("file_name.csv")

我使用的是1.10.4版本。最终我使用了“read_csv”并设置“col_types = "c"”,然后在转换为数字之前修剪了第一个字符。这是一种不太优雅的解决方法。 - EngrStudent

1

我知道这已经过去8年了,但我刚遇到这个问题并找到了解决方法,希望能对你有所帮助。一个重要的细节(如上所述)是需要设置fileEncoding="UTF-8-BOM"而不仅仅是encoding="UTF-8-BOM"。"encoding"适用于一些选项,但不适用于UTF-8-BOM。找到了这篇文章:https://www.johndcook.com/blog/2019/09/07/excel-r-bom/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接