Ich stimme mit @ Sixiang.Hu Antwort, R unzip() wird nicht zuverlässig mit Dateien größer als 4 GB arbeiten.
Um zu zu bekommen, wie hast du es gelöst?: Ich habe ein paar verschiedene Tricks damit ausprobiert, und nach meiner Erfahrung ist das Ergebnis von allem, das die eingebauten R von R verwendet, (fast) immer eine falsche Identifikation des EOF-Markers vor dem eigentlichen Ende von die Datei.
Ich behandle dieses Problem in einer Reihe von Dateien, die ich auf einer nächtlichen Basis verarbeiten, und um es konsequent und in einer automatisierten Art und Weise zu behandeln, schrieb ich die folgende Funktion wickeln Sie das UNIX unzip. Dies ist im Grunde, was Sie mit System (unzip()) tun, aber gibt Ihnen ein bisschen mehr Flexibilität in seinem Verhalten, und ermöglicht es Ihnen, auf Fehler systematischer zu überprüfen.
decompress_file <- function(directory, file, .file_cache = FALSE) {
if (.file_cache == TRUE) {
print("decompression skipped")
} else {
# Set working directory for decompression
# simplifies unzip directory location behavior
wd <- getwd()
setwd(directory)
# Run decompression
decompression <-
system2("unzip",
args = c("-o", # include override flag
file),
stdout = TRUE)
# uncomment to delete archive once decompressed
# file.remove(file)
# Reset working directory
setwd(wd); rm(wd)
# Test for success criteria
# change the search depending on
# your implementation
if (grepl("Warning message", tail(decompression, 1))) {
print(decompression)
}
}
}
Hinweise:
Die Funktion ein paar Dinge tut, die Ich mag und empfehlen:
- verwendet
system2
über System, weil the documentation sagt „system2 ist ein tragbarer und flexible Schnittstelle als System "
- trennt th e
directory
und file
Argumente, und verschiebt das Arbeitsverzeichnis auf das Argument directory
; Je nach System, unzip (oder Ihre Wahl der Entpacker) bekommt Archive außerhalb des Arbeitsverzeichnis
- es ist nicht rein, aber das Zurücksetzen des Arbeitsverzeichnis ist ein schöner Schritt in Richtung auf die Funktion weniger Nebenwirkungen mit etwa Dekomprimieren
wirklich pingelig
- Sie können es technisch ohne dass dies, aber nach meiner Erfahrung ist es einfacher, die Funktion ausführlicher zu machen, als zu tun haben Dateipfade zu erzeugen und die Erinnerung unzip CLI Flaggen
- ich es setze die Option -o verwenden, um Überschreibt automatisch, wenn es erneut ausgeführt wird, aber Sie könnten eine beliebige Anzahl von Argumenten
angeben
- enthält ein
.file_cache
Argument, das Sie Dekompression
- Das ist praktisch, überspringen können, wenn Sie einen Prozess zu test, die auf der entpackten Datei ausgeführt wird, da 4GB + Dateien sind in der Regel einige Zeit in Anspruch nehmen
dekomprimieren
- in diesem Fall kommentiert, aber wenn Sie wissen, dass Sie nicht das Archiv müssen nach Dekomprimierung, können Sie es inline
- der system2 Befehl leitet den stdout Dekompression entfernen, um ein Zeichen Vektor
- eine
if
+ grepl
Prüfung am Ende sieht für Warnungen im stdout und druckt die stdout, wenn es, dass die Expression
I 7-Zip verwenden musste findet dies selbst zu tun. – sconfluentus