【问题标题】:Dealing with Byte Order Mark (BOM) in R [duplicate]在R中处理字节顺序标记(BOM)
【发布时间】:2017-01-28 08:25:57
【问题描述】:

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

开头带有 BOM 的示例 csv 文件。

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文件的方法,遇到的问题和解决方法。

【问题讨论】:

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


    【解决方案1】:

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

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

    对于 fread,使用:

    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 编码”后保存文件

    【讨论】:

    • 对于那些在对 Windows 数据文件的空洞感到沮丧之后来这里寻找有关 BOM 和 R 的权威信息的人们,您还应该点击这个 —github.com/ropenscilabs/gtfsr/issues/19#issuecomment-247766324 — 这个 — gist.github.com/hrbrmstr/be3bf6e2b7e8b06648fd — 这个 — @ 987654323@——还有这个——github.com/hadley/readr/issues/500
    • 应该避免事后方法,我会说。最好从源头上解决问题。另外,在大多数情况下不要使用as.data.table。使用setDT,因为它不会创建副本。
    • 谢谢@MichaelChirico,我已经修改了答案。但是我还不够熟练,甚至无法理解如何从源头上解决问题。
    • 别担心!那不一定在你身上。我会向readr 报告这个问题;事实上,readr's GH page 上已经有一个好评率很高的问题
    猜你喜欢
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    相关资源
    最近更新 更多