2017-06-28 2 views
0

Ich habe eine große Anzahl von Ordnern, die csv und htm-Dateien unter jedem Ordner enthalten (einige Ordner haben mehrere CSV-Dateien und einige mit nur einer CSV-Datei).Wie wähle ich Ordner mit nur einer CSV-Datei aus einer großen Anzahl von Ordnern aus?

Wäre es möglich, diese Ordner mit nur einer CSV-Datei automatisch zu screenen und zu importieren und die Daten in R oder andere statistische Pakete zu importieren?

+0

Wenn die CVS-Dateien Sie wollen lesen Sie haben ein gemeinsames Muster, können Sie 'list.files' mit' pattern' Argument verwenden –

Antwort

0
getwd() 
all_files<-list.files() 
split_all_files<-sapply(all_files,function(x) strsplit(x, "\\.")[1]) 

for(i in seq(1,length(all_files))){ 

    if(split_all_files[[i]][2]=="csv"){ 
    data_file<-data.frame() 
    data_file<-read.csv(all_files[i]) 

    } 
} 
0

Die OP hat beantragt, alle Verzeichnisse für csv Dateien zu suchen, sondern nur diejenigen Verzeichnisse zu betrachten, die genau einecsv Datei enthalten. Nur diese Dateien sollten importiert werden.

Auf UNIX-Systemen gibt es OS wie fgrep Befehle, die wahrscheinlich für diesen Zweck verwendet werden kann, aber ich glaube, die Lösung Basis R unten sollte auf jedem System arbeiten:

# define starting dir 
path <- file.path("path", "to", "start", "search") 
# or path <- file.path(".") 
# or path <- getwd() 

# find all directories, recursively, i.e., also sub-directories 
dirs <- list.dirs(path, recursive = TRUE) 

# search all directories for csv files, i.e., file name is ending with csv 
# return result as a list with a vector of file names per list element 
csv_files <- lapply(dirs, list.files, pattern = "\\.csv$", full.names = TRUE) 

# pick only those list elements which contain exactly one .csv file 
# and unlist to get vector of file names. 
# note lenghts() gets the length of each element of a list 
files_to_read <- unlist(csv_files[lengths(csv_files) == 1L]) 

# read selected files, return result in a list 
imported <- lapply(files_to_read, data.table::fread) 
# or use a different file reader, alternatively 
imported <- lapply(files_to_read, readr::read_csv) 

# name list elements to identify imported data sets 
setNames(imported) <- files_to_read 
# or use only the file name 
setNames(imported) <- basename(files_to_read) 
# or use only the name of the enclosing directory 
setNames(imported) <- basename(dirname(files_to_read)) 
Verwandte Themen