【问题标题】:How to skip/handle an empty-sheet/No-sheet in R Excel Automation?如何在 R Excel 自动化中跳过/处理空表/无表?
【发布时间】:2019-08-24 19:54:44
【问题描述】:

我正在尝试合并/绑定大量数据。该代码已编写并且工作正常。尝试在没有工作表的情况下合并数据时出现问题。有什么方法可以跳过错误吗?

library(tidyverse)
library(xlsx)

files <- list.files(pattern="*.xlsx")

read_Sheet_1 <- lapply(files, readxl::read_excel, sheet = "Sheet 1")
Sheet_1 = do.call(rbind, read_Sheet_1) 

read_Sheet_2 <- lapply(files, readxl::read_excel, sheet = "Sheet 2")
Sheet_2 = do.call(rbind, read_Sheet_2)

read_Sheet_3 <- lapply(files, readxl::read_excel, sheet = "Sheet 3")
Sheet_3 = do.call(rbind, read_Sheet_3) 

write.xlsx(as.data.frame(Sheet_1), file="Final.xlsx", sheetName="Sheet_1", row.names=FALSE)
write.xlsx(as.data.frame(Sheet_2), file="Final.xlsx", sheetName="Sheet_2", append=TRUE, row.names=FALSE)
write.xlsx(as.data.frame(Sheet_3), file="Final.xlsx", sheetName="Sheet_3", append=TRUE, row.names=FALSE)

预期结果:将每个工作表中的行合并到一个 Final.xlsx 文件中 实际结果:即使函数将行合并在一起。如果其中一个文件中只有 2 张纸,则会出现错误。示例:File3.xlsx 中只有“Sheet 1”和“Sheet 3”,而不是“Sheet 2”。所以这将对整个“Sheet_2”数据框抛出错误。

【问题讨论】:

    标签: r excel automation


    【解决方案1】:

    您可以使用purrr 包中的safely

    library(tidyverse)
    library(xlsx)
    
    files <- list.files(pattern="*.xlsx")
    
    read_excel_safe <- function(file, sheet) {
      read_excel_safely <- safely(readxl::read_excel, otherwise = NULL)
      read_excel_safely(file, sheet = sheet)$result
    }
    
    Sheet_1 <- files %>% 
      map(.f = read_excel_safe, sheet = 'Sheet 1') %>% 
      reduce(rbind) 
    

    函数read_excel_safely 将返回一个带有错误和结果的命名列表。如果有错误,结果将是NULL。在执行该减少步骤时,它应该会影响rbind

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-28
      相关资源
      最近更新 更多