web-dev-qa-db-fra.com

Utilisation de R pour télécharger un fichier de données compressé, extraire et importer des données

@EZGraphs sur Twitter écrit: "Beaucoup de csv en ligne sont compressés. Existe-t-il un moyen de télécharger, décompresser l'archive et de charger les données dans un data.frame à l'aide de R? #Rstats"

J'essayais aussi de faire cela aujourd'hui, mais j'ai fini par télécharger le fichier Zip manuellement.

J'ai essayé quelque chose comme:

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

mais je me sens comme si je suis loin. Des pensées?

114
Jeromy Anglim

Les archives Zip sont en réalité plus un 'système de fichiers' avec des métadonnées de contenu, etc. Voir help(unzip) pour plus de détails. Donc, pour faire ce que vous esquissez ci-dessus, vous devez

  1. Créer un temp. nom de fichier (par exemple tempfile())
  2. Utilisez download.file() pour récupérer le fichier dans le répertoire temporaire. fichier
  3. Utilisez unz() pour extraire le fichier cible de temp. fichier
  4. Supprimez le fichier temporaire via unlink()

qui dans le code (merci pour l'exemple de base, mais c'est plus simple) ressemble à

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

Les fichiers compressés (.z) Ou gzipped (.gz) Ou bzip2ed (.bz2) Sont niquement le fichier et ceux que vous pouvez lire directement à partir d'une connexion . Alors demandez au fournisseur de données de l'utiliser à la place :)

162
Dirk Eddelbuettel

Pour mémoire, j'ai essayé de traduire la réponse de Dirk en code :-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

J'ai utilisé le package CRAN "téléchargeur" ​​disponible sur http://cran.r-project.org/web/packages/downloader/index.html . Beaucoup plus facile.

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

Pour Mac (et j'assume Linux) ...

Si l'archive Zip contient un seul fichier, vous pouvez utiliser la commande bash funzip, en conjonction avec fread à partir du fichier data.table paquet:

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

Dans les cas où l'archive contient plusieurs fichiers, vous pouvez utiliser tar à la place pour extraire un fichier spécifique sur stdout:

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

Voici un exemple qui fonctionne pour les fichiers qui ne peuvent pas être lus avec le read.table une fonction. Cet exemple lit un fichier .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))
5
ColinTea

Essayez ce code. Ça marche pour moi:

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

Exemple:

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

Pour ce faire, à l’aide de data.table, j’ai constaté que les opérations suivantes fonctionnaient. Malheureusement, le lien ne fonctionne plus, j'ai donc utilisé un lien pour un autre ensemble de données.

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)

Je sais que cela est possible en une seule ligne car vous pouvez transmettre des scripts bash à fread, mais je ne sais pas comment télécharger un fichier .zip, l'extraire et en transmettre un seul fichier à fread.

3
Mallick Hossain