data.table::fread 读取 Excel 工作簿中的所有工作表

5

我的Excel文件my.xlsx有两个工作表,分别命名为Sheet1Sheet2。我想使用data.table R包的fread函数读取Excel工作簿中的所有工作表。下面的代码只能读取当前活动的工作表。请问如何读取所有工作表而不知道它们的名称。谢谢。

df3 <- data.table::fread("in2csv my.xlsx")
> names(df3)
[1] "A" "B"
> df3
   A  B
1: 1  2
2: 2  4
3: 3  6
4: 4  8
5: 5 10

1
你不能使用 readxlopenxlsx 吗?(https://dev59.com/Zl4c5IYBdhLWcg3wnrj9) - akrun
2
是的,我可以使用 readxlrioopenxlsx。但是我的实际文件大小超过 300MB,因此需要使用 data.table::fread。有什么想法,请告诉我。 - MYaseen208
1
它没有这个功能。如果适应fread算法可能有帮助,但您可以按照此处的说明进行查看 https://github.com/Rdatatable/data.table/wiki/Support - Frank
2
那么,这些文件是如何创建的?还有,是什么天才决定将其作为任务的良好文件格式? - Roland
1
那么你可能也看到了这个:链接--write-sheets WRITE_SHEETS Excel表格要写入文件的名称,或“-”表示全部写入。 - ismirsehregal
显示剩余4条评论
1个回答

6

我上次需要从一个XLSX文件中读取多个工作表时,使用了openxlsx::read.xlsx

#install.packages("openxlsx")
library(openxlsx)
#?openxlsx::read.xlsx

#using file chooser:
filename <- file.choose()
#or hard coded file name:
#filename <- "filename.xlsx"

#get all the sheet names from the workbook
SheetNames<-getSheetNames(filename)

# loop through each sheet in the workbook
for (i in SheetNames){

  #Read the i'th sheet
  tmp_sheet<-openxlsx::read.xlsx(filename, i)

  #if the input file exists, append the new data;; else use the first sheet to initialize the input file
  ifelse(exists("input"),
         input<-rbind(input, tmp_sheet),
         input<-tmp_sheet)
}

注意: 这里假设每个工作表具有相同的列结构和数据类型。在合并之前,您可能需要标准化/归一化数据(例如:tmp_sheet <- as.data.frame(sapply(tmp_sheet,as.character), stringsAsFactors=FALSE)),或将每个工作表加载到其自己的数据框中并进行进一步的预处理。

1
感谢 @M.Viking 的回答。我想知道是否可以读取大于 300 MB 的工作簿。 - MYaseen208
1
openxlsx的作者说:“Java和xlsx的内存问题是我编写这个包的原因。”- 你读取数据了吗?有错误吗? - M.Viking
基于Python的命令行工具https://github.com/dilshod/xlsx2csv。"处理大型XLSX文件。"请注意-a参数。 - M.Viking
在这里看第二个例子 https://linoxide.com/linux-how-to/methods-convert-xlsx-format-files-csv-linux-cli/ 。这是通过命令行实现的。在Linux上我运行了 $ sudo pip3 install xlsx2csv,然后运行 $ xlsx2csv -a filename.xlsx foldername 来创建一个同名文件夹,并为每个工作表创建一个CSV文件。另外,$ xlsx2csv -a filename.xlsx > filename.csv 会生成一个单独的CSV文件,但在每个数据工作表之间会添加一个标题行(例如:-------- sheetname)。 - M.Viking
我使用了 import xlsx2csvxlsx2csv -a my.xlsx foldername 命令,但是出现了以下错误:File "<stdin>", line 1 xlsx2csv -a my.xlsx foldername ^ SyntaxError: invalid syntax。请问您有什么想法? - MYaseen208
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接