我有多个.xls(~ 100 MB)文件,我想从这些文件中加载多个工作表(每个工作表)到R中作为 Dataframe 。我尝试过各种函数,如xlsx::xlsx2
和XLConnect::readWorksheetFromFile
,这两个函数总是运行很长时间(〉15分钟),并且永远不会完成,我必须强制退出RStudio才能继续工作。
我还尝试了gdata::read.xls
,它确实完成了,但每一张表需要3分钟以上,而且它不能像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"
上面使用的test_file.xls
是可用的here。任何建议将不胜感激,在使第一个函数运行更快或read_xls
运行在所有-谢谢!
更新(12/14/2019):
似乎有些用户能够使用readxl::read_xls
功能打开上面的文件,而其他人则不能,无论是在Mac和Windows上,使用最新版本的R
,Rstudio
,和readxl
.该issue has been posted on the readxl GitHub和尚未得到解决.
更新(4/14/2023):
上述GitHub问题成为了各种问题的组合,并产生了一个可能的解决方案,即首先在MS Excel中打开和关闭文件,随后使其可由readxl::read_xls
读取。可以理解,虽然这不是最好的解决方案。上述问题在没有更好的解决方案的情况下关闭,而是related issue was opened in the libxls GitHub,到目前为止没有解决方案。
8条答案
按热度按时间yzckvree1#
我下载了你的数据集,并以这种方式阅读了每个Excel工作表(例如,对于工作表“总体”和“面积”):
最后,我像这样得到dt(例如,只有“Area”表的部分数据集):
同样,您也可以使用
read_xls
函数代替read_excel
。我检查了一下,它也能正常工作,甚至更快,因为
read_excel
是readxl
包中read_xls
和read_xlsx
函数的 Package 器。此外,您可以使用
readxl
包中的excel_sheets
函数读取Excel文件的所有工作表。更新
使用
microbenchmark
软件包对以下软件包/函数进行基准测试:gdata::read.xls
、XLConnect::readWorksheetFromFile
和readxl::read_excel
。但是
XLConnect
是一个基于Java的解决方案,所以它需要大量的RAM。egdjgwm82#
我发现我无法在下载后立即使用
read_xl
打开该文件,但如果我在Excel中打开该文件,保存它,然后再次关闭它,那么read_xl
就能够打开它而没有问题。我建议处理数百个文件的解决方案是构建一个小的C#命令行实用程序,用于打开,保存和关闭Excel文件。源代码如下,该实用程序可以使用Visual Studio社区版编译。
编译后,可以使用例如
system2()
从R调用该实用程序。zdwk9cvp3#
我将提出一个不同的工作流程。如果你碰巧安装了LibreOffice,那么你可以通过编程将Excel文件转换为csv。我有Linux,所以我在bash中这样做,但我相信在macOS中也可以。
因此,打开一个终端,导航到包含Excel文件的文件夹,然后在终端中运行:
现在,在R中,你可以使用
data.table::fread
通过一个循环来读取你的文件:场景1:文件结构不同
如果文件的结构不同,那么你不想把它们放在一起。你可以在R中运行:
如果你想将列表中的命名元素提取到全局环境中,以便将它们转换为对象,你可以使用
list2env
:请注意两件事:首先,在
gsub
调用中,斜线的方向。其次,如果全局环境中的对象与列表中的命名元素同名,则list2env
可能会覆盖这些对象。场景二:文件的结构相同
在这种情况下,很可能你想把它们都放在一起。你可以在R中运行:
fv2wmkja4#
在我的系统上,我不得不使用
path.expand
。wwtsj6pe5#
重新保存您的文件,您可以轻松解决您的问题。
我以前也发现过这个问题,但我从你们的讨论中得到了答案。
我用
read_excel()
打开了这些文件。nbysray56#
我看到了一个类似的错误,并希望分享一个短期的解决方案。
收益率(在我的课堂上的一些系统上,但不是其他系统):
错误:文件路径:MLBPayrolls.xls libxls错误:无法打开文件
临时解决方案是将xls文件的URL粘贴到Firefox中,然后通过浏览器下载。一旦完成,我们就可以运行
read_excel
行而不会出错。这是今天在Windows 10上发生的,使用R 3.6.2和R Studio 1.2.5033。
bjg7j2ky7#
如果你已经从网上下载了.xls数据,即使你在Ms.Excel中打开它,它也会首先打开一个提示,要求确认你是否信任来源,见下面的截图,我猜这就是R(read_xls)也无法打开它的原因,因为它被认为是不安全的。将其保存为.xlsx文件,然后使用
read_xlsx()
或read_excel()
.q43xntqr8#
虽然这不是一个基于代码的解决方案,但我只是改变了类型文件。例如,将
xls
保存为csv
或xlsx
。然后将其打开为常规文件。我为我工作,因为当我打开我的
xls
文件时,我弹出消息:* “'file.xls''的文件格式和扩展名不匹配。该文件可能已损坏或不安全..."*