2016-07-31 10 views
0

Ich möchte in mehreren festen Breite Format TXT-Dateien in R lesen, aber ich muss sie zuerst entpacken.read_fwf funktioniert nicht beim Entpacken von Dateien

Da sie sehr große Dateien sind, möchte ich read_fwf aus dem readr Paket verwenden, weil es sehr schnell ist.

Wenn ich tun:

read_fwf(unz(zipfileName, fileName), fwf_widths(colWidths, col_names = colNames))

ich diesen Fehler Error in isOpen(con) : invalid connection

Allerdings, wenn ich tun:

read.table(unz(zipfileName, fileName)) ohne Breiten specfiying es in R liest gerade fein. Irgendwelche Gedanken, warum das nicht mit read_fwf funktioniert?

Ich habe Probleme, ein reproduzierbares Beispiel zu machen. Hier ist, was ich habe:

df <- data.frame(
    rnorm(100), 
    rnorm(100) 
) 

write.table(df, "data.txt", row.names=F, col.names = F) 
zip(zipfile = "data.zip", files = "data.txt") 
colWidths <- rep(2, 100) 
colNames <- c("thing1","thing2") 
zipfileName <- "data.zip" 
fileName <- "data.csv" 
+0

Ich sehe nur eine Spalte. Ich sehe auch nicht, dass Sie "zipfileName" –

+0

@ 42-editierte Edits definiert haben, damit das Beispiel dem Problem entspricht. – Warner

+0

Lesen Sie '? Unz' sorgfältiger. Insbesondere: '" Die 'Beschreibung' ist der vollständige Pfad zur Zip-Datei, mit der Erweiterung '.zip', falls erforderlich. "' –

Antwort

1

Ich hatte auch Probleme read_fwf bekommen Zip-Dateien zu lesen, wenn eine unz -ed-Datei, um es vorbei, aber dann das Lesen der ?read_fwf Seite sehe ich, dass ZIP-Dateien versprochen werden automatisch behandelt werden. Sie haben keine Datei machen, das eine gültige FWF als ein Beispiel war, da weder die Säulen konstante Positionen hatten, aber das ist offensichtlich mit der Ausgabe:

read_fwf(file="~/data.zip", fwf_widths(widths=rep(16,2) ,col_names = colNames)) 
Warning: 1 parsing failure. 
row col expected actual 
    3 thing2 16 chars  14 
# A tibble: 100 x 2 
      thing1    thing2 
       <chr>    <chr> 
1 1.37170820802141 -0.58354018425322 
2 0.03608988699566 7 -0.402708262870141 
3 1.02963272114 -1  .0644333112294 
4 0.73546166509663 8 0.607941664550652 
5 -1.5285547658079 -0.319983522035755 
6 -1.4673290956901 0.523579231857175 
7 0.24946312418273 9 -0.574046655188405 
8 0.58126541455159 5 -0.406516495600345 
9 1.5074477698981 -0.496512994239183 
10 -2.2999905645658 8 -0.662667854341041 
# ... with 90 more rows 

Der Fehler, den Sie aus der unz Funktion war immer waren, weil Es erwartet einen vollständigen Pfad zu einer Zip-Erweiterungsdatei (und akzeptiert anscheinend keinen impliziten Arbeitsverzeichnispfad) als das Argument "description". Das zweite Argument ist der Name der komprimierten Datei in der ZIP-Datei. Ich denke, es gibt eine Verbindung zurück, aber nicht von einem Typ, den read_fwf verarbeiten kann. Doing Parsen von Hand sehe ich, dass die Fehler uns beide waren in read_connection von diesem Abschnitt des Codes bekamen:

> readr:::read_connection 
function (con) 
{ 
    stopifnot(is.connection(con)) 
    if (!isOpen(con)) { 
     open(con, "rb") 
     on.exit(close(con), add = TRUE) 
    } 
    read_connection_(con) 
} 
<environment: namespace:readr> 

Sie nicht unz ein gültiges „description“ Argument gegeben haben, und selbst wenn wir haben die Mühe open mit open(con, "rb") scheitert wegen der fehlenden Standardisierung in Argumenten in den verschiedenen Dateiverarbeitungsfunktionen.

+0

Glücklicherweise enthält jede Zip-Datei nur die eine Datei, die ich in R einlesen möchte. Ich bin gespannt, wie 'read_fwf' mit einer Zip-Datei mit mehreren Dateien umgehen würde . – Warner

+1

Als ich ihm eine Zip-Datei mit zwei Elementen gab, wählte er die erste aus. (Ich hätte die Zip-Datei zu einem vollständigen Verzeichnis erweitert und dann damit gearbeitet, wenn ich die zweite oder spätere Datei haben wollte.) –

+0

Danke, dass Sie das überprüft haben. Das ist gut zu wissen und ich denke, es hat einige Auswirkungen darauf, wie 'read_fwf' mit Zip-Dateien umgehen sollte. – Warner