2017-06-28 2 views
0

J'ai un grand nombre de dossiers contenant des fichiers csv et htm dans chaque dossier (certains dossiers ont plusieurs fichiers csv et certaines avec un seul fichier csv).Comment sélectionner des dossiers ne contenant qu'un seul fichier CSV parmi un grand nombre de dossiers?

Serait-il possible de filtrer automatiquement et obtenir ces dossiers avec un seul fichier csv et importer les données dans R ou d'autres progiciels statistiques?

+0

Si le CVS fichiers que vous voulez lire avoir un modèle commun, vous pouvez utiliser 'list.files' avec l'argument' pattern' –

Répondre

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

L'OP a demandé de rechercher tous les répertoires pour csv fichiers, mais à considérer uniquement les répertoires qui contiennent exactement un fichiercsv. Seuls ces fichiers doivent être importés.

Sur les systèmes UNIX, il y a des commandes OS comme fgrep qui peut probablement être utilisé à cette fin, mais je crois que la solution de base de R ci-dessous devrait fonctionner sur tout système:

# 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))