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

我经常从生成非标准Excel格式的源文件中读取数据,这些格式不能被readxl::read_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_excel 。 我希望我也可以使用XLConnect批量保存它们,然后使用readxl::read_excel读取它们。 不幸的是,使用Linux,我不能只是脚本Excel来重新保存它们。 有没有人有另一种解决方法?

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

您可以启动一个单独的R进程来使用XLConnect读取每个电子表格。 这可以通过至less两种方式来完成:

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

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

后者的例子:

 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