2016-10-19 3 views
0

Ich muss diverse csv Dateien aus einer Quelle in eine Liste importieren, indem Sie lapply verwenden.Importieren Sie mehrere CSV-Dateien in eine Liste und überspringe Dateien, die nicht existieren

Der Punkt ist, dass die csv-Dateien, die ich möchte, sind z.B. 100 aber die Quelle enthält nur 80 von ihnen.

Wie kann ich die Dateien überspringen, die nicht in der Quelle enthalten sind?

Hier mein Code:

stations <- read.csv("stations.csv", header = TRUE) 
filenames <- paste(stations$ID, "csv", sep = ".") #define the filenames 
directory <- "~I/am/not/that/dumb" #set directory where take files to read 
filenames <- file.path(directory, filenames) #construct the files paths 

list <- lapply(filenames, read.csv, header = FALSE, stringsAsFactors = FALSE) #import the csv into a list 

Aber ich habe den Fehler:

Error in file(file, "rt") : cannot open the connection In addition: Warning message: In file(file, "rt") : cannot open file '/Users/I/am/not/that/dumb/26003.csv': No such file or directory

offensichtlich, da die Datei 26003.csv nicht in der Quelle enthalten.

Irgendwelche Vorschläge zum Überspringen der nicht vorhandenen Dateien?

Die insgesamt zu importierenden CSV-Dateien sind >> 100, daher kann ich das nicht manuell machen.

+0

verwenden Vielleicht die Ergebnisse 'dir (Verzeichnis) verwenden' oder den Schnittpunkt dieser mit Dateinamen: 'myFilenames <- schneiden (dir (Verzeichnis), Dateinamen))' sollte einen Vektor der Dateinamen in Ihrem ursprünglichen csv zurückgeben, die sich tatsächlich in dem Verzeichnis befinden. – lmo

+1

Sie können die Dateien, die nicht mit 'file.exists' existieren, nicht 'ausfiltern'? – Abdou

+0

Jungs vielen Dank, aber ich frage Sie :) –

Antwort

0

Ich kann mir zwei Möglichkeiten vorstellen.

1) prüfen Existenz von Dateinamen vor (ähnlich einem Kommentar am OP Import):

stations <- read.csv("stations.csv", header = TRUE) 
filenames <- paste(stations$ID, "csv", sep = ".") 
directory <- "~I/am/not/that/dumb" 
filenames <- file.path(directory, filenames) 
filenames <- intersect(filenames, list.files(directory, full.names = TRUE)) # added 
list <- lapply(filenames, read.csv, header = FALSE, stringsAsFactors = FALSE) 

2) Verwenden try/tryCatch Fehler behandeln:

A Ein einfacher Ansatz wäre:

stations <- read.csv("stations.csv", header = TRUE) 
filenames <- paste(stations$ID, "csv", sep = ".") 
directory <- "~I/am/not/that/dumb" 
filenames <- file.path(directory, filenames) 

lst <- lapply(filenames, function(x) { 
    try(read.csv(x, header = FALSE, stringsAsFactors = FALSE)) 
}) 

Das Ergebnis Das Listen-Objekt kann dann try-error Elemente enthalten. Wenn Sie sie entfernen möchten, können Sie

lst <- lst[sapply(lst, function(x) !inherits(x, "try-error"))] 
Verwandte Themen