readr::read_csv()函数中忽略末尾分隔符。

5
当我使用 readr::read_csv() 读取包含尾随分隔符的 CSV 文件时,我会收到一个警告,说明已创建最后一列的新名称。以下是一个简短的示例文件内容,以展示我的意思:
A,B,C,
2,1,1,
14,22,5,
9,-4,8,
17,9,-3,

请注意每行末尾的逗号。现在,如果我使用以下方式加载这些数据
readr::read_csv("A,B,C,\n2,1,1,\n14,22,5,\n9,-4,8,\n17,9,-3,")

我收到了以下信息:

New names:
• `` -> `...4`

生成的数据框多了一个名为...4的第四列,其中每行都是NA值。
# A tibble: 4 × 4
      A     B     C ...4 
  <dbl> <dbl> <dbl> <lgl>
1     2     1     1 NA   
2    14    22     5 NA   
3     9    -4     8 NA   
4    17     9    -3 NA   

即使我仅显式加载第一列的三个列,也会从数据源中检索所有列。
read_csv(
    "A,B,C,\n2,1,1,\n14,22,5,\n9,-4,8,\n17,9,-3,",
    col_types=cols_only(
        A=col_integer(),
        B=col_integer(),
        C=col_integer()
    )
)

我仍然收到这个消息。

这是预期的行为吗?还是有一种方法可以告诉 readr :: read_csv()只忽略我指定的列?或者是否有另一种方法可以整理这个(明显格式错误的)CSV文件,以便删除/忽略尾随分隔符?


你能添加一个小例子来展示这个问题吗?这个警告会以某种方式影响输出还是只是一条信息? - aosmith
这只是一个警告信息,但即使使用 cols_only 参数,所有列似乎都被导入了,这看起来很奇怪。我编辑了我的问题并包含了一个小的 CSV 文件示例以展示问题。 - cbrnr
2个回答

3

我认为你无法这样做。从文档中可以看到,cols_only()是针对您已经加载的R对象的。

但是,data.table库的fread()函数允许您在读取文件时选择特定的列名:

DT <- fread("filename.csv", select = c("colA","colB"))


2
这是一个带有错误信息的另一个示例。
> read_csv("1,2,3\n4,5,6", col_names = c("x", "y"))
Warning: 2 parsing failures.
row # A tibble: 2 x 5 col     row   col  expected    actual         file expected   <int> <chr>     <chr>     <chr>        <chr> actual 1     1  <NA> 2 columns 3 columns literal data file 2     2  <NA> 2 columns 3 columns literal data

# A tibble: 2 x 2
      x     y
  <int> <int>
1     1     2
2     4     5

这里是修复/黑客的方法。还可以查看此SOF链接。 抑制R中读取器解析问题

> suppressWarnings(read_csv("1,2,3\n4,5,6", col_names = c("x", "y")))
# A tibble: 2 x 2
      x     y
  <int> <int>
1     1     2
2     4     5

这篇博客文章介绍了如何捕捉特定的警告。只抑制这个特定的警告可能会很有用。 - nevrome

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