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'
Laiboonh
quelle
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=",")
Planapus
quelle
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

user5496072
quelle
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")
Holger Brandl
quelle
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)
Smart D.
quelle
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.

Holger Brandl
quelle
2

In diesem Ausdruck haben Sie einen Punkt verloren

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

Es sollte sein:

temp <- tempfile("Sales", fileext=c(".zip"))
Jorge Moreno
quelle
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

Natheer Alabsi
quelle