readxl::read_xls返回“libxls错误:无法打开文件”

mzsu5hc0  于 2023-04-18  发布在  其他
关注(0)|答案(8)|浏览(162)

我有多个.xls(~ 100 MB)文件,我想从这些文件中加载多个工作表(每个工作表)到R中作为 Dataframe 。我尝试过各种函数,如xlsx::xlsx2XLConnect::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上,使用最新版本的RRstudio,和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,到目前为止没有解决方案。

yzckvree

yzckvree1#

我下载了你的数据集,并以这种方式阅读了每个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"))

最后,我像这样得到dt(例如,只有“Area”表的部分数据集):

同样,您也可以使用read_xls函数代替read_excel
我检查了一下,它也能正常工作,甚至更快,因为read_excelreadxl包中read_xlsread_xlsx函数的 Package 器。
此外,您可以使用readxl包中的excel_sheets函数读取Excel文件的所有工作表。

更新

使用microbenchmark软件包对以下软件包/函数进行基准测试:gdata::read.xlsXLConnect::readWorksheetFromFilereadxl::read_excel
但是XLConnect是一个基于Java的解决方案,所以它需要大量的RAM。

egdjgwm8

egdjgwm82#

我发现我无法在下载后立即使用read_xl打开该文件,但如果我在Excel中打开该文件,保存它,然后再次关闭它,那么read_xl就能够打开它而没有问题。
我建议处理数百个文件的解决方案是构建一个小的C#命令行实用程序,用于打开,保存和关闭Excel文件。源代码如下,该实用程序可以使用Visual Studio社区版编译。

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();
    }
  }
}

编译后,可以使用例如system2()从R调用该实用程序。

zdwk9cvp

zdwk9cvp3#

我将提出一个不同的工作流程。如果你碰巧安装了LibreOffice,那么你可以通过编程将Excel文件转换为csv。我有Linux,所以我在bash中这样做,但我相信在macOS中也可以。
因此,打开一个终端,导航到包含Excel文件的文件夹,然后在终端中运行:

for i in *.xls
    do soffice --headless --convert-to csv "$i" 
done

现在,在R中,你可以使用data.table::fread通过一个循环来读取你的文件:

场景1:文件结构不同

如果文件的结构不同,那么你不想把它们放在一起。你可以在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可能会覆盖这些对象。

场景二:文件的结构相同

在这种情况下,很可能你想把它们都放在一起。你可以在R中运行:

files <- dir("path/to/files", pattern = ".csv")
joined <- list()
for (i in 1:length(files)){
  joined <- rbindlist(joined, fread(files[i]), fill = TRUE)
}
fv2wmkja

fv2wmkja4#

在我的系统上,我不得不使用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
wwtsj6pe

wwtsj6pe5#

重新保存您的文件,您可以轻松解决您的问题。
我以前也发现过这个问题,但我从你们的讨论中得到了答案。
我用read_excel()打开了这些文件。

nbysray5

nbysray56#

我看到了一个类似的错误,并希望分享一个短期的解决方案。

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行而不会出错。
这是今天在Windows 10上发生的,使用R 3.6.2和R Studio 1.2.5033。

bjg7j2ky

bjg7j2ky7#

如果你已经从网上下载了.xls数据,即使你在Ms.Excel中打开它,它也会首先打开一个提示,要求确认你是否信任来源,见下面的截图,我猜这就是R(read_xls)也无法打开它的原因,因为它被认为是不安全的。将其保存为.xlsx文件,然后使用read_xlsx()read_excel() .

q43xntqr

q43xntqr8#

虽然这不是一个基于代码的解决方案,但我只是改变了类型文件。例如,将xls保存为csvxlsx。然后将其打开为常规文件。
我为我工作,因为当我打开我的xls文件时,我弹出消息:* “'file.xls''的文件格式和扩展名不匹配。该文件可能已损坏或不安全..."*

相关问题