2011-11-18 80 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