5 Stimmen

Wie kann man eine große CSV-Datendatei mit R in einzelne Datendateien aufteilen?

Ich habe eine CSV-Datei, deren erste Zeile die Namen der Variablen und die restlichen Zeilen die Daten enthalten. Wie kann ich sie in Dateien aufteilen, die jeweils nur eine Variable in R enthalten? Wird diese Lösung stabil sein? Was ist z. B., wenn die Eingabedatei 100 GB groß ist?

Die Eingabedateien sehen wie folgt aus

var1,var2,var3
1,2,hello
2,5,yay
...

Ich möchte 3 (oder beliebig viele Variablen) Dateien var1.csv, var2.csv, var3.csv erstellen so dass die Dateien wie folgt aussehen Datei1

var1
1
2
...

Datei2

var2?
2
5
...

Datei3

var3
hello
yay

Ich habe eine Lösung in Python ( Wie kann man eine große CSV-Datei in einzelne Dateien aufteilen? ), aber ich frage mich, ob R dasselbe tun kann? Im Wesentlichen liest der Python-Code die csv-Datei Zeile für Zeile und schreibt dann die Zeilen einzeln aus. Kann R das Gleiche tun? Der Befehl read.csv liest die gesamte Datei auf einmal, und das kann den gesamten Prozess verlangsamen. Außerdem kann eine 100-Gramm-Datei nicht gelesen und verarbeitet werden, da R versucht, die gesamte Datei in den Speicher zu lesen. Ich kann keinen Befehl in R finden, mit dem man eine csv-Datei Zeile für Zeile lesen kann. Bitte helfen Sie mir. Danke!!!

7voto

apeescape Punkte 1079

Sie können scan und dann write zeilenweise in eine oder mehrere Dateien zu übertragen.

i <- 0
while({x <- scan("file.csv", sep = ",", skip = i, nlines = 1, what = "character");
       length(x) > 1}) {
  write(x[1], "file1.csv", sep = ",", append = T)
  write(x[2], "file2.csv", sep = ",", append = T)
  write(x[3], "file3.csv", sep = ",", append = T)
  i <- i + 1
}

bearbeiten!!! Ich verwende die oben genannten Daten, die über 1000 Mal kopiert wurden. Ich habe einen Geschwindigkeitsvergleich durchgeführt, wenn die Dateiverbindung ständig geöffnet ist.

ver1 <- function() {
  i <- 0
  while({x <- scan("file.csv", sep = ",", skip = i, nlines = 1, what = "character");
         length(x) > 1}) {
    write(x[1], "file1.csv", sep = ",", append = T)
    write(x[2], "file2.csv", sep = ",", append = T)
    write(x[3], "file3.csv", sep = ",", append = T)
    i <- i + 1
  }
}

system.time(ver1()) # w/ close to 3K lines of data, 3 columns
##    user  system elapsed 
##   2.809   0.417   3.629 

ver2 <- function() {
  f <- file("file.csv", "r")
  f1 <- file("file1.csv", "w")
  f2 <- file("file2.csv", "w")
  f3 <- file("file3.csv", "w")
  while({x <- scan(f, sep = ",", skip = 0, nlines = 1, what = "character");
         length(x) > 1}) {
    write(x[1], file = f1, sep = ",", append = T, ncol = 1)
    write(x[2], file = f2, sep = ",", append = T, ncol = 1)
    write(x[3], file = f3, sep = ",", append = T, ncol = 1)
  } 
  closeAllConnections()
}

system.time(ver2())
##   user  system elapsed 
##   0.257   0.098   0.409

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X