处理多个目录,每个目录包含R中的多个文件

时间:2015-09-09 09:57:58

标签: r excel csv directory

我正在使用

处理特定目录中的每个文件
 func loadData (dataPath : String, parameters:Dictionary <String,String>, importHandler: ((data:JSON) -> Void)?)  {

        let urlPath = baseURL +  dataPath

        let start = NSDate()
        Alamofire.request(.GET, urlPath, parameters: parameters, headers: ["X-API-KEY": apiKey, "Content-type application":"json", "Accept application" : "json"]).responseJSON() {
            (req,res, data, error) in

            if error != nil {
   .... 

用于最终输出的代码(在处理目录中的所有文件之后):

files=list.files(path_of_directory, recursive=T, pattern='.xlsx')
for(i in 1:length(files))  
{
#Some processing takes places which takes all files in a particular directory
and produces single file
}

每次我更改目录的路径以处理它包含的文件时,我还会根据处理的目录更改单个输出文件的名称。假设目录是D1,D2和D3,每个目录包含文件F1和F2。有没有什么方法可以进一步自动化这个过程。该程序执行以下步骤: 1.我移动到特定目录 2.处理该目录中的所有文件,最终的sinle文件与目录名称相同。 3.移动到下一个目录 4.处理下一个目录中的所有文件,最后一个文件的名称与目录相同。 5.此过程一直持续到所有目录和包含的文件都被处理完毕。 6.因此,如果有五个目录,则会生成5个excel文件。现在假设D1目录是进程,我应该将输出作为D1处理。如果能够帮助编写相同的代码,那将是非常有帮助的。

2 个答案:

答案 0 :(得分:2)

您可以继续使用相同的逻辑。例如,将处理包装在为每个目录调用它的函数中。

lapply(list("path_d1","path_d2"),  ## add list of directory here
    function(path_of_directory){
          files=list.files(path_of_directory, 
                       recursive=TRUE, pattern='.xlsx')
          lapply(files ,function(file){ ## better to use lapply here than for loop
          ## Some processing takes places 
          ## which takes all files in a particular directory
          ## and produces single file
     })
})

答案 1 :(得分:2)

您可以将循环嵌套在2个级别中,这样第1级循环通过目录,第2级循环通过每个目录中的文件。考虑一下:

#List all dirs you need to process
dlist <- list.dirs("parent_dir") #parent dir==main dir with all the dirs

#Loop over dirs
for(d in dir_list){

    #List files in d'th dir that need to be processed
    flist <- list.files(d, pattern='.xlsx')

    #Loop over files
    for(f in flist){

        #Some processing takes places here
    }

#Write output
write.xlsx(datasetr_df, file=paste0(d,".xlsx"), 
sheetName="Sheet1",col.names=T, row.names=F)

#Report progress
print(paste0("Finished processing directory ", d))

}