r - readxl::read_xls 返回“libxls 错误:无法打开文件”
问题描述
我有多个 .xls (~100MB) 文件,我想将多个工作表(从每个工作表)作为数据框加载到 R 中。我尝试了各种功能,例如xlsx::xlsx2
and XLConnect::readWorksheetFromFile
,它们总是运行很长时间(> 15 分钟)并且永远不会完成,我必须强制退出 RStudio 才能继续工作。
我也试过gdata::read.xls
了,它确实完成了,但每张纸需要超过 3 分钟,并且它不能像XLConnect::loadWorkbook
can.
执行这些函数所需的时间(我什至不确定如果我让它们运行更长时间,前两个函数是否会完成)对于我需要同时处理许多文件的管道来说太长了。有没有办法让这些更快/完成?
在几个地方,我看到了使用 function 的建议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"
test_file.xls
上面使用的可以在这里找到。在使第一个函数运行得更快或read_xls
完全运行方面,任何建议都将不胜感激 - 谢谢!
更新:
似乎有些用户能够使用该readxl::read_xls
功能打开上述文件,而其他用户则不能,在 Mac 和 Windows 上,使用最新版本的R
、Rstudio
和readxl
. 该问题已发布在 readxl GitHub 上,尚未解决。
解决方案
我下载了您的数据集并以这种方式读取了每个 Excel 工作表(例如,对于工作表“Overall”和“Area”):
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"))
最后,我得到这样的 dt (例如,“区域”表只有部分数据集):
同样,您可以改用该read_xls
函数read_excel
。
我检查了一下,它也可以正常工作,甚至更快一些,因为read_excel
它是一个包装器,read_xls
并且是read_xlsx
来自 package.json 的函数readxl
。
此外,您可以使用包中的excel_sheets
函数readxl
来读取 Excel 文件的所有工作表。
更新
microbenchmark
对以下包/功能的包进行基准测试gdata::read.xls
:XLConnect::readWorksheetFromFile
和readxl::read_excel
.
但XLConnect
它是基于 Java 的解决方案,因此需要大量 RAM。
推荐阅读
- node.js - 在heroku中运行时命令处理程序不起作用
- html - 是否有用于放置谷歌搜索网站的图标图标的 HTML 代码?
- c# - 如何使用 HttpWebRequest 以 XML 格式发送请求正文
- sql - MSSQL:使用 DISTINCT,没有 GROUP BY 子句的 TOP 选择
- javascript - javascript全局变量范围问题:代码末尾未显示更新的值
- c++ - C++ 中的通用属性访问
- android - Android 访问在属性中查看模型实例
- python - 如何从图像中删除方括号?
- html - Scss+Pug+Webpack配置问题
- php - 将三种不同的形式合二为一并在 wordpress 中得到结果