Automatiser le fichier zip de la lecture dans la R
J'ai besoin d'automatiser R pour lire un fichier csv qui est dans un fichier zip.
Par exemple, j'type:
read.zip(file = "myfile.zip")
Et à l'intérieur, ce qui pourra être fait est:
- Décompresser
myfile.zip
dans un dossier temporaire - Lire le seul fichier qu'il contient à l'aide de
read.csv
Si il n'y a plus d'un fichier dans le fichier zip, une erreur est renvoyée.
Mon problème est d'obtenir le nom du fichier contenu dans le fichier zip, dans l'ordre numérique croissante à fournir, il ne le read.csv
de commande. Quelqu'un sait-il comment faire?
Mise à JOUR
Voici la fonction que j'ai écrit basé sur @Paul réponse:
read.zip <- function(zipfile, row.names=NULL, dec=".") {
# Create a name for the dir where we'll unzip
zipdir <- tempfile()
# Create the dir using that name
dir.create(zipdir)
# Unzip the file into the dir
unzip(zipfile, exdir=zipdir)
# Get the files into the dir
files <- list.files(zipdir)
# Throw an error if there's more than one
if(length(files)>1) stop("More than one data file inside zip")
# Get the full name of the file
file <- paste(zipdir, files[1], sep="/")
# Read the file
read.csv(file, row.names, dec)
}
Car je vais travailler avec plusieurs fichiers à l'intérieur de la tempdir()
, j'ai créé un nouveau répertoire à l'intérieur, donc je ne peut pas se confondre avec les fichiers. J'espère que ça peut être utile!
- possible les doublons? à: stackoverflow.com/questions/3053833/...; stackoverflow.com/questions/7044808/...
- En fait le premier lien c'est pas liée, depuis que mon problème n'était pas de la décompression du fichier, mais pour obtenir le nom des fichiers dans le zip. Mais oui, la seconde montre les
list.files
de commande, qui était (à ce jour) inconnu par moi. - vous pouvez obtenir pour les noms de fichier dans le fichier zip en utilisant
unzip(file, list=TRUE)
, comme je l'ai utilisé dans ma réponse.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
unzip
pour décompresser le fichier. Je viens de vous parler de ce qu'il n'est pas clair à partir de votre question si vous le saviez déjà. En ce qui concerne la lecture du fichier. Une fois votre extrait le fichier dans un dossier temporaire dir (?tempdir
), il suffit d'utiliserlist.files
pour trouver les fichiers que lorsque l'objet de dumping dans le répertoire temporaire. Dans votre cas c'est juste un fichier, le fichier dont vous avez besoin. La lecture à l'aide deread.csv
est alors assez simple:en supposant que votre
tempdir
l'emplacement est stocké danstemp_path
.system("ls")
mais il n'a pas retourné un objet R - comme un vecteur. Merci!system("ls", intern = TRUE)
est probablement ce que vous espérezUne autre solution à l'aide de
unz
:J'ai trouvé ce fil que je cherche à automatiser la lecture de plusieurs fichiers csv à partir d'un zip. J'ai adapté la solution à l'ensemble de l'affaire. Je n'ai pas testé pour bizarre les noms de fichiers ou similaire, mais c'est ce qui a fonctionné pour moi, alors j'ai pensé que je devais partager:
recursive=TRUE
danslist.files()
; Aussi, au lieu d'utilisergrep()
de sous-ensemble dans la deuxième définition de lafiles
, vous pouvez simplement utiliser lepattern
argument enlist.files
:files <- list.files(zipdir, recursive=TRUE, pattern="\\.csv$"
. J'ai également fait une appellation d'amélioration de la liste retournée,names(csv.data) <- gsub(".+\\/", "", files,perl=T)
. Je pourrais ajouter ces changements comme une nouvelle réponse, mais n'hésitez pas à mettre à jour votre approche. Merci!pattern
etrecursive
. Je doute que je vais modifier ma réponse, mais j'avais le plaisir de voir votre code. Merci!Si vous avez zcat installé sur votre système (ce qui est le cas pour linux, macos, et cygwin), vous pouvez également utiliser:
Cette solution a aussi l'avantage qu'aucun des fichiers temporaires sont créés.
Ici est une approche que j'utilise qui est fortement basée sur @Corned-Beef Hash Map 's réponse. Voici les modifications que j'ai apportées:
Mon approche rend l'utilisation de la
data.table
paquetfread()
, quipeut être rapide (en général, si il est zippé, taille pourraient être de grande taille, de sorte que vous
à gagner beaucoup de vitesse ici!).
J'ai également ajusté le format de sortie, de sorte que c'est un nom de liste, où
chaque élément de la liste est nommé d'après le fichier. Pour moi, c'était un
plus très utile.
Au lieu d'utiliser des expressions régulières pour examiner les fichiers
saisi par liste.fichiers, j'utilise
list.file()
'spattern
argument.
Enfin, j'ai en s'appuyant sur
fread()
et en faisantpattern
unargument à laquelle vous pouvez fournir quelque chose comme
""
ouNULL
ou"."
, vous pouvez l'utiliser pour lire dans de nombreux types de fichiers de données; en fait,vous pouvez le lire dans plusieurs types à la fois (si votre .zip contient
.csv, .txt, vous voulez à la fois, par exemple). Si il y a seulement quelques types de
les fichiers que vous souhaitez, vous pouvez spécifier le modèle à utiliser uniquement ceux-là, aussi.
Ici est la fonction réelle:
Suivantes affine les réponses ci-dessus. AMUSANT pu être lue.csv, chat, ou tout ce que vous voulez, en fournissant le premier argument d'accepter un chemin d'accès au fichier. E. g.
Une autre approche qui utilise
fread
à partir des données.tableau paquetBasé sur la touche de prise/mise à jour par @jean-daniel
Je viens d'écrire une fonction fondée sur le dessus read.zip qui peut aider...
décompressé l'emplacement du fichier de
outDir<-"~/Documents/unzipFolder"
obtenir tous les fichiers zip
zipF <- list.files(path = "~/Documents/", pattern = "*.zip", full.names = TRUE)
, décompressez vos fichiers
purrr::map(.x = zipF, .f = unzip, exdir = outDir)