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

时间:2017-10-16 20:47:00

标签: r csv parsing tidyverse readr

我正在解析大量的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"

请注意,第二行的“棕色”周围有虚假引号。此内容会进入名为“ 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'

正如您所看到的,解析失败并非“非常印刷”。这是一个长达271个字符的行。

我无法弄清楚甚至在故障消息中放置换行符的位置,以查看问题所在以及消息试图告诉我的内容。而且,它指的是“2x5 tibble”。什么呀?我的数据框是3x3。

有人可以告诉我如何在 read_csv()的消息中格式化或放置换行符,以便我可以看到它是如何检测到问题的?

是的,我知道这个特殊的最小例子中的问题是什么。在我的实际数据中,我正在处理大量的csv(约1M行),充满了不一致性,让我感到数百次解析失败。我想设置一个工作流程来对这些进行分类并以编程方式处理它们。我认为,第一步是了解如何“解析”解析失败消息。

1 个答案:

答案 0 :(得分:11)

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

解决失败的所有方法就是使用 problems()

import os
import lxml.etree as ET

inputpath = "D:\\temp\\"
xsltfile = "D:\\temp\\test.xsl"
outpath = "D:\\output"


for dirpath, dirnames, filenames in os.walk(inputpath):
            for filename in filenames:
                if filename.endswith(('.xml', '.txt')):
                    dom = ET.parse(inputpath + filename)
                    xslt = ET.parse(xsltfile)
                    transform = ET.XSLT(xslt)
                    newdom = transform(dom)
                    infile = unicode((ET.tostring(newdom, pretty_print=True)))
                    outfile = open(outpath + "\\" + filename, 'a')
                    outfile.write(infile)

显然 read_csv()关联包含解析失败详细信息的tibble,并且可以通过将 read_csv 的结果传递给 problems()来访问。