2017-07-11 3 views
0

Ich versuche, eine CSV-Datei Zeile für Zeile zu lesen und nur die 2. und die 3. Zelle von links, und die 3. Zelle von rechts. Zum Beispiel, wenn es 17 Zellen in dieser Zeile gibt, werde ich die 15. Zelle nehmen. Dann möchte ich diese 3 Zellen, getrennt durch Komma, kombinieren und dann diese Zeile in eine neue CSV-Datei schreiben.Wie schreibe ich eine Datei Zeile für Zeile in R

Feind jetzt benutze ich nur eine for-Schleife für den Zugriff auf jede Zeile und dann teilen sie durch Komma. Dann wähle ich die gewünschten Zellen aus und kombiniere sie als String und füge sie an eine große String-Variable an. Sobald die for-Schleife beendet ist, schreibe ich die Datei mit writeLines() aus. Es dauert jedoch eine lange Zeit, diesen Prozess zu beenden, da 2,8 Millionen Zeilen vorhanden sind und viel Speicher benötigt wird. Gibt es eine Möglichkeit, es effizienter zu machen? Oder kann ich die Ausgabedatei zeilenweise in die for-Schleife schreiben?

FileLinebyLine <- read_lines("testfile.csv") 

pt<-proc.time() 
NewFile <- "" 
RowList <- list() 
for (i in 1:length(FileLinebyLine)) 
{ 
    a <- strsplit(FileLinebyLine[i],",") 
    RowList[i] = paste(a[[1]][2],a[[1]][3],a[[1]][(length(a[[1]]) - 2)], sep = ",") 

} 
NewFile <- paste(unlist(RowList), sep = "\n") 
proc.time()-pt 
outputfile <- file("output.txt") 
writeLines(NewFile,outputfile) 
close(outputfile) 

Ich habe auch() in der for-Schleife zu verwenden write_lines versucht, aber es gibt mir immer den Fehler bei

isOpen (Pfad): ungültige Verbindung

Kann mir jemand helfen? Ich weiß es zu schätzen!!!

+1

R ist kein gutes Werkzeug für diese Methode. Ich würde Sie ermutigen, Kommandozeilen-Tools anstelle von 'sed' oder' awk' zu verwenden, wenn Ihre Daten nicht in den Speicher passen. Wenn Ihre Daten in den Speicher passen, ist es in R viel schneller, den gesamten Datenrahmen auf einmal zu lesen (oder z. B. 500.000 Zeilen), die gewünschten Spalten auszuwählen und dann die Ausgabe auf einmal zu schreiben – Gregor

Antwort

0

Ja, Sie können Zeile für Zeile lesen und schreiben, obwohl ich nicht weiß, wie schnell es sein wird. Hier ist ein Beispiel, das eine Datei Zeile für Zeile, die vierte Element in jeder Zeile und schreibt in einer neuen Datei eine Zeile zu einem Zeitpunkt zu lesen:

con = file("temp.csv", "r") 
while(length(x <- readLines(con, n = 1)) > 0) { 
    write(strsplit(x,",")[[1]][4], file="out.csv", append=T) 
} 
close(con) 

temp.csv

a,b,c,d,e,f,g,h 
x,y,z,a,b,c,d,e 
1,2,3,4,5,6,7,8 
q,w,e,r,t,y,u,i 

out.csv

d 
a 
4 
r 

Hoffe, dass hilft.

Bearbeiten: Sie können auch library(compiler); enableJIT(3) hinzufügen, um Ihre Schleifen ein wenig zu beschleunigen.

+0

Ich danke dir sehr! –

+0

Danke! Bitte wählen und als Antwort markieren, wenn es hilft! – thc

+0

Es bedeutet "lesen", so dass die Verbindung zur Datei nur gelesen werden kann. – thc

Verwandte Themen