У меня есть список файлов в каталоге с форматом
Firstname-Lastname-DateofBirth-ID.pdf
Например Tom-Hanks-01.01.1960-5555.pdf Идентификатор до сих пор представляет собой 4-значное число, но в будущем он может быть 5- или 6-значным.
У меня есть вектор идентификаторов, соответствующие файлы PDF которых я хотел бы переместить в другой каталог
Я хотел бы, чтобы R прочитал список файлов в каталоге, идентифицировал идентификатор из имени файла, проверил, находится ли идентификатор в векторах идентификаторов для перемещения, и если да, переместите файл.
Я могу сделать последнюю часть с помощью if () , %in% и system(). Как можно сделать фильтрацию?
Предпочтительное решение tidyverse.
Извините, если я не могу привести воспроизводимый пример. Однако поможет только чтение имен файлов и извлечение идентификатора из имени файла.
Предположим, у нас есть следующие текстовые файлы в текущем рабочем каталоге.
$ ls *.txt
Tom-Hanks-01.01.1960-11.txt
Tom-Hanks-01.01.1960-88.txt
Tom-Hanks-01.01.1960-4444.txt
Tom-Hanks-01.01.1960-5555.txt
Tom-Hanks-01.01.1960-123456.txt
И я хочу переместить файлы с идентификаторами 111, 222, 5555, 88 и 123456 в папку текущего wd с именем dest. Итак, мы можем сделать следующее,
library(fs)
library(stringr)
# grab the text files
files <- fs::dir_ls(".", glob = "*.txt")
id_to_move <- c(111, 222, 5555, 88, 123456)
# match the pattern which files we need to move.
files_to_move <- files[str_extract(files, "(?<=-)\\w+(?=.txt)") %in% id_to_move]
# move the file.
fs::file_move(files_to_move, "dest")
$ ls dest
Tom-Hanks-01.01.1960-123456.txt
Tom-Hanks-01.01.1960-5555.txt
Tom-Hanks-01.01.1960-88.txt
С основанием R:
filelist <- list.files(pattern = "*.csv")
filelist
[[1]]
[1] "Tom-Hanks-01.01.1960-11.pdf"
[[2]]
[1] "Tom-Hanks-01.01.1960-88.pdf"
[[3]]
[1] "Tom-Hanks-01.01.1960-4444.pdf"
[[4]]
[1] "Tom-Hanks-01.01.1960-5555.pdf"
[[5]]
[1] "Tom-Hanks-01.01.1960-123456.pdf"
idsToMove <- c(1111, 2222, 3333, 4444, 5555)
toMove <- filelist[sapply(filelist, FUN = \(x) strsplit(x=x, split = "-|.pdf", perl=TRUE)[[1]][4] %in% idsToMove)]
> toMove
[[1]]
[1] "Tom-Hanks-01.01.1960-4444.pdf"
[[2]]
[1] "Tom-Hanks-01.01.1960-5555.pdf"
Если вектор идентификаторов называется id_vec, то можно попробовать dir(pattern = paste(id_vec, collapse = '|'), full.names = TRUE)