2010-06-16 12 views
93

@EZGraphs su Twitter scrive: "Un sacco di csv online sono compressi, c'è un modo per scaricare, decomprimere l'archivio e caricare i dati in un dato. frame using R? #Rstats "Utilizzo di R per scaricare il file di dati compresso, estrarre e importare i dati

Anche stavo cercando di farlo oggi, ma ho finito per scaricare il file zip manualmente.

ho provato qualcosa di simile:

fileName <- "http://www.newcl.org/data/zipfiles/a1.zip" 
con1 <- unz(fileName, filename="a1.dat", open = "r") 

ma mi sento come se fossi lontano. Qualche idea?

+0

Ha funzionato? Se è così, perché ti sentiresti ancora molto lontano? – FrustratedWithFormsDesigner

+0

@Frustrato ... No. il codice nella mia domanda non funziona. Vedi le risposte di seguito. –

risposta

141

Gli archivi zip sono in realtà più un "file system" con metadati dei contenuti ecc. Per ulteriori dettagli, vedere help(unzip). Quindi, per fare ciò che si disegna sopra è necessario

  1. Creare una temp. nome del file (es. tempfile())
  2. Utilizzare download.file() per recuperare il file nel temp. file
  3. Utilizzare unz() per estrarre il file di destinazione da temp. il file
  4. Rimuovere il file temporaneo tramite unlink()

che nel codice (grazie per esempio di base, ma questo è più semplice) si presenta come

temp <- tempfile() 
download.file("http://www.newcl.org/data/zipfiles/a1.zip",temp) 
data <- read.table(unz(temp, "a1.dat")) 
unlink(temp) 

compressa (.z) o gzip (.gz) o bzip2ed (.bz2) i file sono solo il file e quelli che è possibile leggere direttamente da una connessione. Così ottenere il provider di dati da utilizzare che invece :)

+0

Dirk, ti ​​dispiacerebbe espandere come estrarre i dati da un archivio '.z'? Posso leggere da una connessione url con 'readBin (url (x," rb "), 'raw', 99999999)', ma come posso estrarre i dati contenuti? Il pacchetto 'uncompress' è stato rimosso da CRAN - è possibile in base a R (e in tal caso, è limitato ai sistemi * nix?)? Felice di postare come una nuova domanda, se del caso. – jbaums

+3

Vedere 'help (gzfile)' - Stavo pensando che il protocollo gzip ora può anche decomprimere (vecchi file) .z ora che il brevetto è scaduto da tempo. Non può Chi usa comunque .z? Gli anni '80 hanno chiamato, vogliono la loro compressione ;-) –

+0

Grazie - Non riesco a farlo funzionare, quindi forse non è supportato dopo tutto. L'Australian Bureau of Meteorology fornisce alcuni dei suoi dati come .z, sfortunatamente! – jbaums

25

Solo per la cronaca, ho provato a tradurre la risposta di Dirk in codice :-P

temp <- tempfile() 
download.file("http://www.newcl.org/data/zipfiles/a1.zip",temp) 
con <- unz(temp, "a1.dat") 
data <- matrix(scan(con),ncol=4,byrow=TRUE) 
unlink(temp) 
+4

Non usare 'scan()'; puoi usare 'read.table()' et al direttamente su una connessione. Vedi la mia risposta modificata, –

+0

Grazie per aver mostrato come implementarlo. –

16

ho usato pacchetto CRAN "downloader" che si trova a http://cran.r-project.org/web/packages/downloader/index.html. Molto più facile.

download(url, dest="dataset.zip", mode="wb") 
unzip ("dataset.zip", exdir = "./") 
+0

aggiungendo semplicemente la virgola - SO si lamenta! (da qui la modifica in basso) – userJT

+1

Io uso solo utils :: decomprimere la necessità del pacchetto downlaoder per me – mtelesha

+1

Incredibile quanto più facile questo pacchetto rende questa attività. Grazie per averlo collegato a – Sean

4

Prova questo codice. Funziona per me:

unzip(zipfile="<directory and filename>", 
     exdir="<directory where the content will be extracted>") 

Esempio:

unzip(zipfile="./data/Data.zip",exdir="./data") 
5

Per Mac (e presumo Linux) ...

Se l'archivio zip contiene un singolo file, è possibile utilizzare la bash comandare funzip, in combinazione con fread dal pacchetto data.table:

library(data.table) 
dt <- fread("curl http://www.newcl.org/data/zipfiles/a1.zip | funzip") 

Nei casi in cui l'archivio contiene più file, è possibile utilizzare tar invece per estrarre un file specifico stdout:

dt <- fread("curl http://www.newcl.org/data/zipfiles/a1.zip | tar -xf- --to-stdout *a1.dat") 
+0

quando ho provato la tua soluzione per più file, ricevo un messaggio di errore che 'File è vuoto:' – bshelt141

3

di farlo usando data.table, ho scoperto che le seguenti opere. Sfortunatamente, il link non funziona più, quindi ho usato un link per un altro set di dati.

library(data.table) 
temp <- tempfile() 
download.file("https://www.bls.gov/tus/special.requests/atusact_0315.zip", temp) 
timeUse <- fread(unzip(temp, files = "atusact_0315.dat")) 
rm(temp) 

So che questo è possibile in una sola riga in quanto è possibile passare script bash per fread, ma io non sono sicuro di come scaricare un file .zip, estrarre, e passare un singolo file da quello a fread.

1

Ecco un esempio che funziona per i file che non possono essere letti con la funzione read.table. Questo esempio legge un file .xls.

url <-"https://www1.toronto.ca/City_Of_Toronto/Information_Technology/Open_Data/Data_Sets/Assets/Files/fire_stns.zip" 

temp <- tempfile() 
temp2 <- tempfile() 

download.file(url, temp) 
unzip(zipfile = temp, exdir = temp2) 
data <- read_xls(file.path(temp2, "fire station x_y.xls")) 

unlink(c(temp, temp2)) 
Problemi correlati