Copy and rename Specific Files based on parent directories in R

早过忘川 提交于 2020-02-06 08:46:31

问题


I am attempting to solve this issue in R, but I'll upvote answers in any programming language.

I have an example vector of filenames like so called file_list

c("D:/example/sub1/session1/OD/CD/text.txt", "D:/example/sub2/session1/OD/CD/text.txt", 
"D:/example/sub3/session1/OD/CD/text.txt")

What I'm trying to do is move and rename the text files to be based on the part of the parent directory that contains the part about sub and session. So the first file would be renamed sub2_session1_text.txtand be copied along with the other text files to just 1 new directory called all_files

I'm struggling with some of the specifics of how to rename the file. I'm trying to use substr combined with str_locate_all and paste0 to copy and rename the files based on these parent directories.

Locate the position in each element of the vector file_list to construct starting and ending position for substr

library(stringr)
ending<-str_locate_all(pattern="/OD",file_list)
starting <- str_locate_all(pattern="/sub", file_list)

I then want to somehow pull out of those lists the starting and ending position of those patterns for each element and then feed it to substr to get the naming down and then in turn use paste0 to create What I'd like is something like

substr_naming_vector<-substr(file_list, start=starting[starting_position],stop=ending[starting_position])

but I don't know how to index the list such that it can know how to correctly index for each element the starting_position. Once I figure that out I'd fill in something like this

#paste the filenames into a vector that represents them being renamed in a new directory  
all_files <- paste0("D:/all_files/", substr_naming_vector)
#rename and copy the files 
file.copy(from = file_list, to = all_files)

回答1:


Here's an example using regular expression, which makes it somewhat shorter:

library(stringr)
library(magrittr)

all_dirs <-
  c("D:/example/sub1/session1/OD/CD/text.txt",
    "D:/example/sub2/session1/OD/CD/text.txt",
    "D:/example/sub3/session1/OD/CD/text.txt")

new_dirs <-
  all_dirs %>%
  # Match each group using regex
  str_match_all("D:/example/(.+)/(.+)/OD/CD/(.+)") %>%
  # Paste the matched groups into one path
  vapply(function(x) paste0(x[2:4], collapse = "_"), character(1)) %>%
  paste0("D:/all_files/", .)

# Copy them.
file.copy(all_dirs, new_dirs)



回答2:


This is one way of doing it. I assumed your file is always called text.txt.

library(stringr)

my_files <- c("D:/example/sub1/session1/OD/CD/text.txt",
              "D:/example/sub2/session1/OD/CD/text.txt", 
              "D:/example/sub3/session1/OD/CD/text.txt")

# get the sub information
subs <- str_extract(string = my_files,
                    pattern = "sub[0-9]")
# get the session information
sessions <- str_extract(string = my_files,
                        pattern = "session[0-9]")

# paste it all together
new_file_names <- paste("D:/all_files/", 
                        paste(subs, 
                              sessions, 
                              "text.txt",
                              sep = "_"),
                  sep = "")

file.copy(from = my_files, 
          to = new_file_names)


来源:https://stackoverflow.com/questions/59387013/copy-and-rename-specific-files-based-on-parent-directories-in-r

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!