2011-11-18 19 views
7

Qual è il modo più semplice per convertire un foglio di calcolo Excel di grandi dimensioni con più fogli di lavoro in file .CSV in R?Salva foglio di lavoro Excel come .csv con R?

Nota che ho provato XLConnect e XLSX e ho scoperto che i miei fogli Excel causavano il crash. Quindi sono specificamente alla ricerca di una soluzione che non usi il pacchetto XLConnect o XLSX.

+1

Perché non utilizzare Excel per convertire in CSV? – Stedy

+5

@Stedy - Forse il foglio di calcolo Excel viene generato come parte di un processo periodico automatizzato che AME non può modificare ma deve ancora lavorare. In alternativa, forse AME ha in realtà 5.000 fogli Excel e ha bisogno di estrarre più fogli da ciascuno, ma sa già come eseguire il loop dei file. Posso pensare ad un gran numero di scenari in cui la conversione manuale diventa da incubo. –

+0

@MattParker - buon punto – Stedy

risposta

5

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

EDIT: per affrontare l'opzione read.xlsx:

Se si dispone di Perl in esecuzione, è necessario una versione corrente di 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) 

Ciò è stato fatto su un Mac e fino a questa domanda mi sono sempre imbattuto nella fase installXLSXsupport() poiché ho sempre ricevuto un errore. Questa volta ho avviato Perl da una riga di comando del terminale, e ho avuto successo dopo aver impostato la mia configurazione personale, definendo i mirror CPAN nel mio continente, e ho lasciato perl in esecuzione.

+0

Questa è una grande risorsa, ma penso che la tua risposta sarebbe ancora migliore se includessi alcuni commenti personali su quali opzioni hai utilizzato e le tue esperienze con loro. È difficile sapere da dove iniziare su una lista come quella. –

+0

Anche se hai notato nel tuo commento, sarebbe stato difficile rendere una risposta su misura per la situazione degli interrogatori perché non c'erano dettagli di tale offerta. Sembrava che fosse necessaria una risposta generale per rispondere a una domanda vaga e sperare di ottenere chiarimenti sui dettagli. –

+0

Grazie per il link DWin. Questa domanda riguarda in realtà un problema che ho avuto con i pacchetti XLConnect e XLSX che non sono in grado di leggere un file .xlsx particolarmente grande. Se converto manualmente i fogli di calcolo in un file CSV, il mio codice R funziona perfettamente. Quindi, per automatizzare il processo, ho bisogno di usare un pacchetto R in grado di leggere file .xlsx di grandi dimensioni e convertirli in file .csv. Dopo aver letto il tuo riferimento, penso che darò uno sparo a gdata. Puoi aiutarmi a capire come convertire file .xlsx usando il pacchetto "gdata"? – AME

9

Ecco un ciclo di scrivere tutti i fogli:

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

risposta aggiornato sulla base del pacchetto 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

Semplice e consigliato. 'read_excel (file)%>% data.table :: fwrite (fileout)' – Rob

Problemi correlati