web-dev-qa-db-ger.com

Mit R können Sie komprimierte Datendateien herunterladen, Daten extrahieren und importieren

@EZGraphs auf Twitter schreibt: "Viele Online-CSVs sind komprimiert. Gibt es eine Möglichkeit, das Archiv herunterzuladen, zu dekomprimieren und die Daten mit R? #Rstats in ein data.frame zu laden?"

Ich habe auch versucht, dies heute zu tun, aber am Ende habe ich nur die Zip-Datei manuell heruntergeladen.

Ich habe versucht, etwas wie:

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

aber ich fühle mich, als wäre ich weit weg. Irgendwelche Gedanken?

114
Jeromy Anglim

Zip-Archive sind eigentlich eher ein 'Dateisystem' mit Inhaltsmetadaten usw. Siehe help(unzip) für Details. Um zu tun, was Sie oben skizzieren, müssen Sie

  1. Erstellen Sie ein Temp. Dateiname (zB tempfile())
  2. Verwenden Sie download.file(), um die Datei in das Temp abzurufen. Datei
  3. Verwenden Sie unz(), um die Zieldatei aus temp zu extrahieren. Datei
  4. Entfernen Sie die temporäre Datei über unlink()

was im Code (danke für einfaches Beispiel, aber das ist einfacher) aussieht

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

Komprimiert (.z) oder gzipped (.gz) oder bzip2ed (.bz2) Dateien sind nur die Datei und solche, die Sie direkt von einer Verbindung lesen können. Also lass den Datenprovider das stattdessen benutzen :)

162

Nur fürs Protokoll, ich habe versucht, Dirks Antwort in Code zu übersetzen :-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)
27
George Dontas

Ich habe das CRAN-Paket "downloader" verwendet, das unter http://cran.r-project.org/web/packages/downloader/index.html zu finden ist. Viel einfacher.

download(url, dest="dataset.Zip", mode="wb") 
unzip ("dataset.Zip", exdir = "./")
17
unixcreeper

Für Mac (und ich nehme Linux an) ...

Wenn das Zip-Archiv eine einzelne Datei enthält, können Sie den Bash-Befehl funzip in Verbindung mit fread aus dem data.table Paket:

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

In Fällen, in denen das Archiv mehrere Dateien enthält, können Sie stattdessen tar verwenden, um eine bestimmte Datei nach stdout zu extrahieren:

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

Hier ist ein Beispiel, das für Dateien funktioniert, die mit der Funktion read.table Nicht eingelesen werden können. In diesem Beispiel wird eine XLS-Datei gelesen.

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))
5
ColinTea

Versuchen Sie diesen Code. Für mich geht das:

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

Beispiel:

unzip(zipfile="./data/Data.Zip",exdir="./data")
4
Marcelo Tibau

Um dies mit data.table zu tun, fand ich, dass das folgende funktioniert. Da der Link leider nicht mehr funktioniert, habe ich einen Link für einen anderen Datensatz verwendet.

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)

Ich weiß, dass dies in einer einzigen Zeile möglich ist, da Sie Bash-Skripte an fread übergeben können, aber ich bin nicht sicher, wie ich eine .Zip-Datei herunterladen, extrahieren und eine einzelne Datei an fread.

3
Mallick Hossain