read_csv() 解析错误信息,如何解读?

read_csv() parsing error message, how to interpret?

我正在解析大量的 csv 数据。数据相当 "dirty" 因为我有不一致的分隔符、虚假字符和格式问题,这些问题导致 read_csv().

出现问题

然而,我的问题不是数据的脏乱,而是试图理解 read_csv() 给我的解析错误。如果我能更好地理解错误消息,我就可以做一些清洁工作来解决脚本问题。 数据的大小使得手动方法难以处理。

这是一个最小的例子。假设我有一个这样的 csv 文件:

"col_a","col_b","col_c"
"1","a quick","10"
"2","a quick "brown" fox","20"
"3","quick, brown fox","30"

请注意,第 2 行 "brown" 周围有假引号。此内容进入名为“my_data.csv”的文件中。

当我尝试读取该文件时,出现了一些解析失败。

> library(tidyverse)
> df <- read_csv("./my_data.csv", col_types = cols(.default = "c"))
Warning: 2 parsing failures.
row # A tibble: 2 x 5 col     row   col           expected actual            file expected   <int> <chr>              <chr>  <chr>           <chr> actual 1     2 col_b delimiter or quote      b './my_data.csv' file 2     2 col_b delimiter or quote        './my_data.csv'

如您所见,解析失败并非"pretty printed"。一行 271 个字符。

我什至不知道在失败消息中的什么地方放置换行符以查看问题出在哪里以及消息试图告诉我的内容。此外,它指的是“2x5 tibble”。什么乱七八糟的?我的数据框是 3x3.

谁能告诉我如何在来自 read_csv() 的消息中设置格式或换行符,以便我了解它是如何检测问题的?

是的,我知道这个特殊的最小示例中的问题所在。在我的实际数据中,我正在处理大量的 csv(约 100 万行),其中充斥着不一致,让我遇到了数百次解析失败。我想设置一个工作流程来对这些进行分类并以编程方式处理它们。我认为,第一步只是了解如何 "parse" 解析失败消息。

深呼吸并查看实际文档后,I see there is a way to get the parsing failures from read_csv() in a form that is very usable

我所要做的就是使用 problems() 来获得解析失败。

> library(tidyverse)
> df <- read_csv("./my_data.csv", col_types = cols(.default = "c"))
Warning: 2 parsing failures.
row # A tibble: 2 x 5 col     row   col           expected actual            file expected   <int> <chr>              <chr>  <chr>           <chr> actual 1     2 col_b delimiter or quote      b './my_data.csv' file 2     2 col_b delimiter or quote        './my_data.csv'

> parsing_failures <- problems(df)
> parsing_failures
# A tibble: 2 x 5
    row   col           expected actual            file
  <int> <chr>              <chr>  <chr>           <chr>
1     2 col_b delimiter or quote      b './my_data.csv'
2     2 col_b delimiter or quote        './my_data.csv'

显然 read_csv() 关联了一个包含解析失败详细信息的小标题,这可以通过传递 read_csv[ 的结果来访问=22=] 到 问题 ().