R 迭代地重新保存Excel文件的目录树

R 迭代地重新保存Excel文件的目录树,r,excel,xlconnect,R,Excel,Xlconnect,我经常从生成非标准Excel格式的源接收数据,该格式不能被readxl::read\u Excel读取。这是github。因此,我有一个完整的目录树,其中包含数百个(几乎)Excel文件,我希望将这些文件读入R并与plyr::ldply相结合。但是,这些文件可以通过XLConnect::loadWorkbook很好地打开。但不幸的是,即使为Java虚拟机分配了大量内存,它也总是在读取一些文件后崩溃。我尝试将以下三行添加到导入函数: options(java.parameters = "-Xmx1

我经常从生成非标准Excel格式的源接收数据,该格式不能被
readxl::read\u Excel
读取。这是github。因此,我有一个完整的目录树,其中包含数百个(几乎)Excel文件,我希望将这些文件读入R并与
plyr::ldply
相结合。但是,这些文件可以通过
XLConnect::loadWorkbook
很好地打开。但不幸的是,即使为Java虚拟机分配了大量内存,它也总是在读取一些文件后崩溃。我尝试将以下三行添加到导入函数:

options(java.parameters = "-Xmx16g")
detach("package:XLConnect", unload = TRUE)
library(XLConnect)
xlcFreeMemory()
然而,我仍然得到:

错误:OutOfMemoryError(Java):Java堆空间


我所需要做的就是将它们重新保存在Excel中,然后从
readxl::read\u Excel
中读取它们。我希望我也可以使用
XLConnect
批量重新保存它们,然后使用
readxl::read\u excel
读取它们。不幸的是,使用Linux,我不能只编写Excel脚本来重新保存它们。有人有其他解决办法吗

由于您在Linux上,运行Excel宏来重新保存电子表格看起来很困难

您可以启动一个单独的R进程,用XLConnect读取每个电子表格。这至少可以通过两种方式实现:

  • 使用脚本文件运行Rscript,并将电子表格的名称传递给它。将数据保存到.RData文件中,并在master R进程中将其读回

  • 使用并行包中的
    parlappy
    ,向其传递一个电子表格名称向量和一个读取文件的函数。在这种情况下,不必作为中间步骤将数据保存到磁盘。但是,您可能必须分块执行此操作,因为除非重新启动从属进程,否则从属进程将慢慢耗尽内存

后者的例子:

files <- list.files(pattern="xlsx$")
filesPerChunk <- 5
clustSize <- 4  # or how ever many slave nodes you want
runSize <- clustSize * filesPerChunk

runs <- length(files)%/%runSize + (length(files)%%runSize != 0)

library(parallel)

sheets <- lapply(seq(runs), function(i) {
    runStart <- (i - 1) * runSize + 1
    runEnd <- min(length(files), runStart + runSize - 1)
    runFiles <- files[runStart:runEnd]

    # periodically restart and stop the cluster to deal with memory leaks
    cl <- makeCluster(clustSize)
    on.exit(stopCluster(cl))

    parLapply(cl, runFiles, function(f) {
        require(XLConnect)
        loadWorkbook(f, ...)
    })
})

sheets <- unlist(sheets, recursive=FALSE)  # convert list of lists to a simple list

文件也许你可以使用宏来批量重新保存xls-sth