Копирование файлов в каталог по дате в R - PullRequest
1 голос
/ 27 января 2020

У меня есть большое количество файлов изображений, взятых в течение нескольких месяцев, которые хранятся в одном каталоге. Я пытаюсь скопировать файлы в серию новых каталогов, с одним каталогом для каждой недели фотографий, которые все содержатся в каталоге для сайта, где они были сделаны (поэтому все фотографии, сделанные на 12 неделе на сайте TM C в ../TMC/week_12 и т. д.). Мне также нужен CSV в каждом каталоге со списком всех файлов за эту неделю с их отметкой времени. CSV и создание каталога в порядке, но у меня возникают проблемы при копировании файлов в правильные папки.

library('lubridate')
library('purrr')

# photo.df is a data frame with all of the photos, their full filepath, and the timestamp when they were taken.

site.dir <- 'D:/photos/TMC'

# Split the data frame by week.
by.week <- split(photo.df, week(photo.df$datetime))

# Create a subfolder for each week.
walk(seq_along(by.week), function(x){
  dir.create(paste(site.dir, '/', 'week_',
                       as.character(x), sep=''))
})

# Save a list of each week's photos as its own csv in the appropriate subfolder.
walk(seq_along(by.week), function(x){
  write.csv(by.week[[x]],
            file=paste(site.dir, '/', 'week_', as.character(x), '/',
                       site, '_photos_', as.character(x), '.csv', sep=''),
            row.names=FALSE)
})

И вот где я застреваю. Как выбрать все файлы изображений для данной недели и скопировать их в соответствующий файл, если у меня есть файлы на много недель? Я понимаю, что R, возможно, не лучший инструмент для этой работы, но остальная часть моего рабочего процесса находится в R, так что это то, что у меня есть. Поскольку фрейм данных by.week содержит полный путь к файлу для каждой фотографии, я подумал, что мог бы объединить by.week[[x]]$filepath и file.copy() с функцией для автоматизации процесса, но я не совсем уверен, как это сделать. Любая помощь приветствуется!

1 Ответ

0 голосов
/ 30 января 2020

С некоторой помощью я смог разработать это решение.

library('lubridate')
library('purrr')

# photo.df is a data frame with all of the filenames of all the photos and the timestamp when they were taken.

photo.df$timestamp <- ymd_hms(photo.df$timestamp)

site.dir <- 'D:/photos/TMC'
path.in <- 'D:/101RECNX/'

# Add a week column.
photo.df <- photo.df %>%
  mutate(week=week(datetime), week=paste0('week_', week))

# Nest the data frame by week.
photo.nest <- photo.df %>% group_nest(week)

# Make a separate csv and directory for each nested week.
walk2(photo.nest$week, photo.nest$data, function(week, data) {
  path <-  paste0(site.dir, '/', week, '/', site, '_photos_', week, '.csv')
  dir.create(dirname(path), recursive=TRUE, showWarning=FALSE)
  write.csv(data, file=path, row.names=FALSE)
})

# Copy the photos into the appropriate directories.
walk2(photo.df$week, photo.df$filename, function(week, filename) {
  target <-  paste0(site.dir, '/', week, '/', filename)
  source <- file.path(path.in, filename)
  file.copy(source, target)
})

Надеюсь, кто-то найдет это полезным!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...