2011-11-18 83 views
7

将具有多个工作表的大型Excel电子表格转换为R中的.CSV文件的最简单方法是什么?将Excel电子表格另存为.csv与R?

请注意,我测试过XLConnect和XLSX,发现我的Excel表导致它崩溃。所以我特别寻找一个不使用XLConnect或XLSX软件包的解决方案。

+1

为什么不直接用excel转换成CSV? – Stedy

+5

@Stedy - 也许Excel电子表格是作为AME无法修改但仍需处理的自动化定期流程的一部分生成的。另外,也许AME实际上有5,000个这样的Excel工作表,并且需要从每个表中提取多个工作表,但已经知道如何跨文件循环。我可以想到许多手动转换变得噩梦的场景。 –

+0

@MattParker - 好点 – Stedy

回答

5

http://rwiki.sciviews.org/doku.php?id=tips:data-io:ms_windows

编辑:解决read.xlsx选项:

如果你有Perl的运行,你需要最新版本GDATA的

require(gdata) 
installXLSXsupport() #now the example from help(read.xls) 
    # load the third worksheet, skipping the first two non-data lines... 
    if('XLSX' %in% xlsFormats()) # if XLSX is supported.. 
     data <- read.xls(exampleFile2007, sheet="Sheet with initial text", skip=2) 
data 
#----------------------- 
    X  X.1 D E. F G Factor 
1 NA FirstRow 1 NA NA NA Red 
2 NA SecondRow 2 1 NA NA Green 
3 NA ThirdRow 3 2 1 NA Red 
4 NA FourthRow 4 3 2 1 Black 
#------------------------ 
write.csv(data) 

这是在Mac上进行,直到这个问题我总是偶然发现installXLSXsupport()阶段,因为我总是遇到错误。这次我从一个终端命令行启动了Perl,并在首次设置我的个人配置,在我的大陆上定义CPAN镜像,并且我离开了perl之后获得了成功。

+0

这是一个很好的资源,但是我认为如果你包括一些你已经使用过的选项和你的经验的个人评论,你的答案会更好。很难知道从哪里开始。 –

+0

即使您在评论中注明,也很难提供适合提问者情况的答案,因为没有提供这样的细节。似乎要回答一个模糊的问题,希望能够澄清细节。 –

+0

感谢链接迪文。这个问题实际上与我在XLConnect和XLSX包无法读取特别大的.xlsx文件时遇到的问题有关。如果我手动将电子表格转换为CSV文件,我的R代码工作得很好。因此,为了使这个过程自动化,我需要使用一个可以读取大型.xlsx文件并将它们转换成.csv文件的R包。读完你的参考资料后,我想我会给gdata一个镜头。你能帮我弄清楚如何使用“gdata”包转换.xlsx文件? – AME

9

这里有一个循环,以写出所有表:

require(gdata) 
## install support for xlsx files 
installXLSXsupport() 
excelFile <- ("/full/path/to/excelFile.xlsx") 
## note that the perl scripts that gdata uses do not cope well will tilde expansion 
## on *nix machines. So use the full path. 
numSheets <- sheetCount(excelFile, verbose=TRUE) 

for (i in 1:numSheets) { 
    mySheet <- read.xls(excelFile, sheet=i) 
    write.csv(mySheet, file=paste(i, "csv", sep="."), row.names=FALSE) 
} 
1

基于readxl包更新的答案。

library("readxl") 

#function to read all sheets of a workbook 
read_excel_allsheets <- function(filename) { 
    sheets <- readxl::excel_sheets(filename) 
    x <- lapply(sheets, function(X) readxl::read_excel(filename, sheet = X)) 
    names(x) <- sheets 
    x 
} 

sheetnames <- read_excel_allsheets("excelFile.xlsx") 
names(sheetnames) 
+0

简单和推荐。 'read_excel(file)%>%data.table :: fwrite(fileout)' – Rob