Ang*_*elo 10 csv parsing r readr tidyverse
我正在解析大量的csv数据.数据相当"脏",因为我有不一致的分隔符,虚假字符和格式问题导致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"
Run Code Online (Sandbox Code Playgroud)
请注意,第二行的"棕色"周围有虚假引号.此内容将进入名为" 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'
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,解析失败并非"非常印刷".这是一长271个字符.
我无法弄清楚甚至在故障消息中放置换行符以查看问题所在以及消息试图告诉我的内容.而且,它指的是"2x5 tibble".什么呀?我的数据框是3x3.
有人可以告诉我如何在read_csv()的消息中格式化或放置换行符,以便我可以看到它是如何检测问题的?
是的,我知道这个特殊的最小例子中的问题是什么.在我的实际数据中,我正在处理大量的csv(约1M行),充满了不一致性,让我感到数百次解析失败.我想设置一个工作流程来对这些进行分类并以编程方式处理它们.我认为,第一步是了解如何"解析"解析失败消息.
Ang*_*elo 14
在深吸一口气并查看实际文档后,我发现有一种方法可以从一个非常有用的表单中获取read_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'
> 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'
Run Code Online (Sandbox Code Playgroud)
显然read_csv()关联包含解析失败详细信息的tibble,并且可以通过将结果从read_csv传递给problems()来访问它.