@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?
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
tempfile()
)download.file()
pour récupérer le fichier dans le répertoire temporaire. fichierunz()
pour extraire le fichier cible de temp. fichierunlink()
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 :)
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)
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 = "./")
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")
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))
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")
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
.