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

Gau*_*hal 5 byte-order-mark r data.table read.csv readr

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

\n\n

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

\n\n
ID,title,clean_title,clean_title_id\n1,0 - 0,,0\n2,"""0 - 1,000,000""",,0\n27448,"20yr. rope walker\nigger",Rope Walker Igger,1832700817\n
Run Code Online (Sandbox Code Playgroud)\n\n

通读read.csv基础 R 包

\n\n
(x1 = read.csv("file1.csv",stringsAsFactors = FALSE))\n#   \xc3\xaf..ID                raw_title        semi_clean semi_clean_id\n# 1     1                    0 - 0                               0\n# 2     2          "0 - 1,000,000"                               0\n# 3 27448 20yr. rope walker\\nigger Rope Walker Igger    1832700817\n
Run Code Online (Sandbox Code Playgroud)\n\n

通读freaddata.table包中的内容

\n\n
(x2 = data.table::fread("file1.csv"))\n#    \xc3\xaf\xc2\xbb\xc2\xbfID                raw_title        semi_clean semi_clean_id\n# 1:     1                    0 - 0                               0\n# 2:     2        ""0 - 1,000,000""                               0\n# 3: 27448 20yr. rope walker\\rigger Rope Walker Igger    1832700817\n
Run Code Online (Sandbox Code Playgroud)\n\n

通读read_csvreadr包中的内容

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

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

\n\n

以下是对所有这些运行名称时的结果

\n\n
names(x1)\n# [1] "\xc3\xaf..ID"         "raw_title"     "semi_clean"    "semi_clean_id"\nnames(x2)\n# [1] "\xc3\xaf\xc2\xbb\xc2\xbfID"         "raw_title"     "semi_clean"    "semi_clean_id"\nnames(x3)\n# [1] "ID"             "raw_title"     "semi_clean"    "semi_clean_id"\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 中x3,前面没有任何“可见”内容ID,但是当您检查时

\n\n
names(x3)[[1]]=="ID"\n# [1] FALSE\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何在每种情况下删除这些不需要的字符。\nPS: 请添加更多读取 csv 文件的方法、面临的问题和解决方案。

\n

Gau*_*hal 5

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

\n\n
x1 = read.csv("file1.csv",stringsAsFactors = FALSE, fileEncoding = "UTF-8-BOM")\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于恐惧,请使用:

\n\n
x2 = fread("file1.csv")\nsetnames(x2, "\xc3\xaf\xc2\xbb\xc2\xbfID", "ID")\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于 read_csv,请使用:

\n\n
x3 = readr::read_csv("file1.csv")\nsetDT(X3) #convert into data tables, so that setnames can be used\nsetnames(x3, "\\uFEFFID", "ID")\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

  • 对于那些在对 Windows 数据文件的空洞性感到沮丧后来这里寻找有关 BOM 和 R 的权威信息的人,您还应该点击此 — https://github.com/ropenscilabs/gtfsr/issues/19#issuecomment-247766324 — 此— https://gist.github.com/hrbrmstr/be3bf6e2b7e8b06648fd — 这个 — https://github.com/hadley/readr/issues/263 — 还有这个 — https://github.com/hadley/readr/issues/ 500。 (2认同)