R Einlesen einer Zip-Datendatei ohne Entpacken


70

Ich habe eine sehr große Zip-Datei und versuche, sie in R einzulesen, ohne sie wie folgt zu entpacken:

temp <- tempfile("Sales", fileext=c("zip"))
data <- read.table(unz(temp, "Sales.dat"), nrows=10, header=T, quote="\"", sep=",")

Error in open.connection(file, "rt") : cannot open the connection
In addition: Warning message:
In open.connection(file, "rt") :
  cannot open zip file 'C:\Users\xxx\AppData\Local\Temp\RtmpyAM9jH\Sales13041760345azip'

Dieser Beitrag kann Ihnen helfen: stackoverflow.com/questions/3053833/…
Sam

Ja, ich habe meine Due Diligence durchgeführt und gesucht, bevor ich diese Frage gestellt habe. Etwas anders als diese Frage ist, dass ich versuche, aus meinem lokalen Dateisystem und nicht über eine URL einzulesen.
Laiboonh

Welche Version von R verwenden Sie? Es kann sich lohnen, die neueste stabile Version auszuprobieren (aus dem Projekt, nicht aus einer Distribution, die möglicherweise dahinter steckt). Ich habe gesehen, dass dieser Fehler in älteren Versionen auftritt, aber nicht in der neuesten, wenn identische Befehle mit unzbeiden ausgeführt werden.
Gcbenison

Haben Sie dieses Problem jemals gelöst?
Jon M

Antworten:


51

Wenn Ihre Zip-Datei aufgerufen wird Sales.zipund nur eine aufgerufene Datei enthält Sales.dat, können Sie meiner Meinung nach einfach Folgendes tun (vorausgesetzt, die Datei befindet sich in Ihrem Arbeitsverzeichnis):

data <- read.table(unz("Sales.zip", "Sales.dat"), nrows=10, header=T, quote="\"", sep=",")

Gibt es eine Möglichkeit, die Dateinamen in der Datei "Sales.zip" zu finden, ohne sie zu extrahieren?
Allen Wang

4
@ AllenWang ja, aber man muss unzipstattdessen Funktion verwenden:unzip("Sales.zip", list=TRUE)
Planapus

Aus readLines(unz("test.zip","file.txt"))irgendeinem Grund wird die letzte Zeile nicht gelesen. Irgendeine Idee, wie ich das beheben kann?
bis

@ by0 Ehrlich gesagt, nein. Bei mir funktioniert es wie erwartet. Vielleicht sollten Sie eine neue Frage mit Ihrem spezifischen Problem eröffnen? Stellen Sie sicher, dass Sie ein reproduzierbares Beispiel geben.
Planapapus

18

Unz muss nicht verwendet werden, da read.table jetzt die komprimierte Datei direkt verarbeiten kann:

data <- read.table("Sales.zip", nrows=10, header=T, quote="\"", sep=",")

Siehe diesen Beitrag


15

Die Methoden des readrPakets unterstützen auch komprimierte Dateien, wenn das Dateisuffix die Art der Datei angibt, dh Dateien, die mit .gz, .bz2, .xz oder .zip enden, werden automatisch dekomprimiert.

require(readr)
myData <- read_csv("foo.txt.gz")

1
Ich hatte keine Ahnung! Hier habe ich meine Zip-Dateien zuerst mit unzipund dann mit extrahiert readr. Vielen Dank, dass Sie meinen Code effizienter gemacht und die Ausführungszeit verkürzt haben!
StatsStudent

3

Dies sollte gut funktionieren, wenn die Datei sales.csv ist.

data <- readr::read_csv(unzip("Sales.zip", "Sales.csv"))

So überprüfen Sie den Dateinamen, ohne die Datei zu extrahieren. Das funktioniert

unzip("sales.zip", list = TRUE)

2

Wenn Sie zcat auf Ihrem System installiert haben (was bei Linux, Macos und Cygwin der Fall ist), können Sie auch Folgendes verwenden:

zipfile<-"test.zip"
myData <- read.delim(pipe(paste("zcat", zipfile)))

Diese Lösung hat auch den Vorteil, dass keine temporären Dateien erstellt werden.


2

In diesem Ausdruck haben Sie einen Punkt verloren

temp <- tempfile("Sales", fileext=c("zip"))

Es sollte sein:

temp <- tempfile("Sales", fileext=c(".zip"))

1

Die Funktion gzfile kann zusammen mit read_csv und read.table komprimierte Dateien lesen.

library(readr)
df = read_csv(gzfile("file.csv.gz"))

library(data.table)
df = read.table(gzfile("file.csv.gz"))

read_csv aus dem readr-Paket kann komprimierte Dateien auch ohne Verwendung der Funktion gzfile lesen.

library(readr)  
df = read_csv("file.csv.gz")

read_csv wird empfohlen, da es schneller als read.table ist

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.