首页 > 解决方案 > 忽略导入中存在解析错误的文件 (read_csv)

问题描述

我有一个 .zip 格式的原始数据,里面有一个 .txt 文件。在大多数情况下,它使用 read_csv 干净地读入,但有些行的数据正在记录其他内容,并且完全扭曲了列结构。这些数据不可能被修复。

使用时read_csv,它显示为解析问题。我想设置我的代码,如果数据中出现此问题,则忽略整个文件。如果有日志记录哪些文件被忽略/丢弃,那就太好了。我查看了possibly(),但由于它不是文件的完整错误,只有行,它不会跳过文件。

这是我目前的代码。

library(dplyr)
library(readr)
library(purrr)

read_log <- function(path) {
  read_csv(path, col_types = cols(.default = col_character())) %>%
    mutate(filename = basename(path))
}

test_files <- file.path("example.txt") #would normally be list.files, simplified for this reprex

raw_data <- map_dfr(test_files, read_log)
#> Warning: 6 parsing failures.
#> row col   expected     actual          file
#>   3  -- 17 columns 4 columns  'example.txt'
#>   4  -- 17 columns 23 columns 'example.txt'
#>   5  -- 17 columns 23 columns 'example.txt'
#>   6  -- 17 columns 23 columns 'example.txt'
#>   7  -- 17 columns 23 columns 'example.txt'
#> ... ... .......... .......... .............
#> See problems(...) for more details.

标签: rpurrrreadr

解决方案


NULL如果返回警告,您可以返回。尝试使用此功能。

library(reader)
library(purrr)
library(dplyr)

read_log <- function(path) {
     data <- tryCatch(read_csv(path,col_types = cols(.default = col_character())),
                               warning = function(e) return(NULL))
     if(!is.null(data))  
        data <- data %>% mutate(filename = basename(path))
     return(data)
}

map使用而不是读取数据map_dfr

all_data <- map(test_files, read_log)

未读取的文件

not_read_files <- test_files[sapply(all_data, is.null)]

合并数据

total_data <- bind_rows(all_data)

推荐阅读