我有多个.xls(〜100MB)文件,我想从中将多个工作表(来自每个工作表)作为数据帧加载到R中。我尝试了各种功能,例如xlsx::xlsx2
和XLConnect::readWorksheetFromFile
,这两个功能始终运行很长时间(> 15分钟),并且从未完成,因此我不得不强制退出RStudio才能继续工作。
我也尝试过gdata::read.xls
,它确实完成了,但是每张纸要花费3分钟以上的时间,并且不能一次提取多张纸(这对加快我的工作流程非常有帮助),就像{{1 }}可以。
执行这些函数所花的时间(而且我甚至不确定如果让它们运行更长的时间,前两个函数是否会完成)对于我的管道来说太长了,我需要一次处理多个文件。有没有办法让它们更快地完成/完成?
在一些地方,我看到了使用功能XLConnect::loadWorkbook
的建议,该功能似乎被广泛推荐用于此任务,并且每张纸应该更快。但是,这给了我一个错误:
readxl::read_xls
我还进行了一些基本测试,以确保文件存在并且格式正确:
> # Minimal reproducible example:
> setwd("/Users/USER/Desktop")
> library(readxl)
> data <- read_xls(path="test_file.xls")
Error:
filepath: /Users/USER/Desktop/test_file.xls
libxls error: Unable to open file
上面使用的> # Testing existence & format of the file
> file.exists("test_file.xls")
[1] TRUE
> format_from_ext("test_file.xls")
[1] "xls"
> format_from_signature("test_file.xls")
[1] "xls"
可用here。
任何建议都会使第一个功能运行得更快,或者使test_file.xls
完全运行-谢谢!
似乎有些用户可以使用read_xls
功能打开上面的文件,而另一些用户不能使用最新版本的readxl::read_xls
,{ {1}}和R
。 issue has been posted on the readxl GitHub并且尚未解决。
答案 0 :(得分:2)
我下载了您的数据集并以这种方式读取每个excel工作表(例如,工作表“总体”和“区域”):
install.packages("readxl")
library(readxl)
library(data.table)
dt_overall <- as.data.table(read_excel("test_file.xls", sheet = "Overall"))
area_sheet <- as.data.table(read_excel("test_file.xls", sheet = "Area"))
最后,我得到这样的数据(例如,“区域”表的数据集的一部分):
同样,您可以使用read_xls
函数代替read_excel
。
我检查了一下,它也可以正常工作甚至更快一点,因为read_excel
是read_xls
包中read_xlsx
和readxl
函数的包装。
此外,您可以使用excel_sheets
包中的readxl
函数来读取Excel文件的所有工作表。
更新
使用microbenchmark
软件包对以下软件包/功能进行基准测试:gdata::read.xls
,XLConnect::readWorksheetFromFile
和readxl::read_excel
。
但是XLConnect
是基于Java的解决方案,因此需要大量RAM。
答案 1 :(得分:0)
我将提出不同的工作流程。如果您恰好安装了LibreOffice,则可以通过编程将excel文件转换为csv。我有Linux,所以我用bash来做,但是我确信它可以在macOS中实现。
因此,打开一个终端,并导航至包含您的excel文件的文件夹,然后在终端中运行:
for i in *.xls
do soffice --headless --convert-to csv "$i"
done
现在在 R 中,您可以使用data.table::fread
来循环读取文件:
如果文件的结构不同,则您不想将它们rbind
在一起。您可以在 R 中运行:
files <- dir("path/to/files", pattern = ".csv")
all_files <- list()
for (i in 1:length(files)){
fileName <- gsub("(^.*/)(.*)(.csv$)", "\\2", files[i])
all_files[[fileName]] <- fread(files[i])
}
如果要将列表中的命名元素提取到全局环境中,以便可以将其转换为对象,则可以使用list2env
:
list2env(all_files, envir = .GlobalEnv)
请注意两件事:首先,在gsub
调用中,斜线的方向。其次,如果list2env
与列表中的命名元素具有相同的名称,则它们可能会覆盖全局环境中的对象。
在这种情况下,您可能想一起rbind
一起使用它们。您可以在 R 中运行:
files <- dir("path/to/files", pattern = ".csv")
joined <- list()
for (i in 1:length(files)){
joined <- rbindlist(joined, fread(files[i]), fill = TRUE)
}
答案 2 :(得分:0)
我看到了类似的错误,想分享一个短期解决方案。
library(readxl)
download.file("https://mjwebster.github.io/DataJ/spreadsheets/MLBpayrolls.xls", "MLBPayrolls.xls")
MLBpayrolls <- read_excel("MLBpayrolls.xls", sheet = "MLB Payrolls", na = "n/a")
收益(在我教室中的某些系统上,但在其他系统上不是):
错误:文件路径:MLBPayrolls.xls libxls错误:无法打开文件
临时解决方案是将xls文件的URL粘贴到Firefox中,然后通过浏览器下载。完成此操作后,我们可以正确运行read_excel
行。
今天,在带有R 3.6.2和R Studio 1.2.5033的Windows 10上发生了这种情况。
答案 3 :(得分:0)
我发现下载后无法立即用read_xl
打开文件,但是如果我在Excel中打开文件,将其保存并再次关闭,则read_xl
可以毫无问题地打开它。
我建议的处理数百个文件的解决方法是建立一个小的C#命令行实用程序,该实用程序可以打开,保存和关闭Excel文件。下面是源代码,可以使用Visual Studio Community Edition编译该实用程序。
using System.IO;
using Excel = Microsoft.Office.Interop.Excel;
namespace resaver
{
class Program
{
static void Main(string[] args)
{
string srcFile = Path.GetFullPath(args[0]);
Excel.Application excelApplication = new Excel.Application();
excelApplication.Application.DisplayAlerts = false;
Excel.Workbook srcworkBook = excelApplication.Workbooks.Open(srcFile);
srcworkBook.Save();
srcworkBook.Close();
excelApplication.Quit();
}
}
}
编译后,可以使用以下命令从R中调用该实用程序system2()
。
答案 4 :(得分:0)
在我的系统上,我必须使用path.expand
。
R> file = "~/blah.xls"
R> read_xls(file)
Error:
filepath: ~/Dropbox/signal/aud/rba/balsheet/data/a03.xls
libxls error: Unable to open file
R> read_xls(path.expand(file)) # fixed
答案 5 :(得分:0)
保存文件即可轻松解决问题。
我之前也发现了这个问题,但是我从您的讨论中得到了答案。
我使用read_excel()
打开这些文件。
答案 6 :(得分:0)