处理R中的字节顺序标记(BOM)

时间:2016-09-20 12:05:28

标签: r data.table byte-order-mark read.csv readr

有时字节顺序标记(BOM)出现在.CSV文件的开头。使用记事本或Excel打开文件时,该符号不可见,但是,当您使用各种方法在R中读取文件时,您将在第一列的名称中使用不同的符号。这是一个例子

示例csv文件,其中包含BOM。

ID,title,clean_title,clean_title_id
1,0 - 0,,0
2,"""0 - 1,000,000""",,0
27448,"20yr. rope walker
igger",Rope Walker Igger,1832700817

阅读基础R包中的read.csv

(x1 = read.csv("file1.csv",stringsAsFactors = FALSE))
#   ï..ID                raw_title        semi_clean semi_clean_id
# 1     1                    0 - 0                               0
# 2     2          "0 - 1,000,000"                               0
# 3 27448 20yr. rope walker\nigger Rope Walker Igger    1832700817

阅读data.table包中的fread

(x2 = data.table::fread("file1.csv"))
#    ID                raw_title        semi_clean semi_clean_id
# 1:     1                    0 - 0                               0
# 2:     2        ""0 - 1,000,000""                               0
# 3: 27448 20yr. rope walker\rigger Rope Walker Igger    1832700817

在readr包中阅读read_csv

(x3 = readr::read_csv("file1.csv"))
#   <U+FEFF>ID                raw_title        semi_clean semi_clean_id
# 1          1                    0 - 0              <NA>             0
# 2          2          "0 - 1,000,000"              <NA>             0
# 3      27448 20yr. rope walker\rigger Rope Walker Igger    1832700817

您可以注意到变量名称ID前面的不同字符。

以下是在所有这些

上运行名称时的结果
names(x1)
# [1] "ï..ID"         "raw_title"     "semi_clean"    "semi_clean_id"
names(x2)
# [1] "ID"         "raw_title"     "semi_clean"    "semi_clean_id"
names(x3)
# [1] "ID"             "raw_title"     "semi_clean"    "semi_clean_id"

x3中,ID前面没有任何“可见”字样,但当您检查时

names(x3)[[1]]=="ID"
# [1] FALSE

如何在每种情况下摆脱这些不需要的角色。 PS:请添加更多方法来阅读csv文件,遇到的问题和解决方案。

1 个答案:

答案 0 :(得分:3)

对于基础R中的read.csv,使用:

x1 = read.csv("file1.csv",stringsAsFactors = FALSE, fileEncoding = "UTF-8-BOM")

对于恐惧,请使用:

x2 = fread("file1.csv")
setnames(x2, "ID", "ID")

对于read_csv,请使用:

x3 = readr::read_csv("file1.csv")
setDT(X3) #convert into data tables, so that setnames can be used
setnames(x3, "\uFEFFID", "ID")

一个基于非R的解决方案是在Notepad ++中打开文件,将更改后的文件保存为“无BOM的UTF-8编码”