2016-08-09 3 views
0

Эта команда работает, чтобы подмножить данные filelist, чтобы удалить все файлы «jpg».использовать grepl() для соответствия нескольким шаблонам данных R

filetype.isnotjpg <- setdiff(filelist, subset(filelist, grepl("\\.jpg$", filelist))) 

Таким образом, это берет строку «filelist», которая содержит имена файлов из каталога. Я хочу вернуть все файлы, которые не относятся к типам «jpg», «doc», «pdf», «xls» и т. Д. Я хочу иметь возможность указать столько типов, сколько хочу, чтобы фильтровать список.

В идеале что-то вроде

target.files <- setdiff(filelist, subset(filelist, grepl( 
    c("\\.jpg$", "\\.doc$", "\\.pdf$", "\\xls$"), filelist) 

Этих рекурсивный алгоритм работает, чтобы сделать то, что я хочу:

a <- setdiff(files.list, subset(files.list, grepl("\\.tmp", files.list, ignore.case = TRUE))) 

a <- setdiff(a, subset(a, grepl("\\.jpg", a, ignore.case = TRUE))) 
a <- setdiff(a, subset(a, grepl("\\.pdf", a, ignore.case = TRUE))) 
a <- setdiff(a, subset(a, grepl("\\.tif", a, ignore.case = TRUE))) 

и т.д. Что-то вроде применять() может работать? Я новичок в R, извините.

Решение 42 работ:

 target.files <- setdiff(
     files.list, 
     subset(files.list, 
       grepl( 
       paste(
        c("\\.jpg", "\\.doc", "\\.pdf", 
        "\\.xls", "\\.tif", "\\.docx", "\\.xlsx", "\\.jpeg"), 
        collapse="|") , 
       files.list, 
       ignore.case = TRUE))) 
+0

Как насчет воспроизводимого примера –

+0

У вас были неправильные опечатки «grepl», которые я исправил. –

ответ

1

Вы можете использовать file_ext в tools, чтобы извлечь расширение из имени файла. Тогда вы можете просто увидеть, если они находятся в вашем списке и использовать стандартный вектор Подменит:

filelist[!(tools::file_ext(filelist) %in% c("jpg","jpeg","doc","pdf","xls"))] 

Если вам нужно игнорировать случай, вы можете обернуть вокруг tolower списка или расширений.

2

Я хотел бы попробовать paste() -ную с разрушающейся разделителем "|" который является оператор ИЛИ для регулярных выражений:

target.files <- setdiff(filelist, subset(filelist, grepl(paste(
c("\\.jpg$", "\\.doc$", "\\.pdf$", "\\xls$"), collapse="|") , filelist) 

вы знаете, что функция list.files также принимает шаблон аргумент, чтобы вы могли сделать это в один шаг с чем-то вроде Сделал:

my_files <- list.files(path="/path/to/dir/", 
         pattern=paste(c("\\.jpg$", "\\.doc$", "\\.pdf$", "\\xls$"), 
             collapse="|")) 
+0

Это работает, я могу сгенерировать строку на данный момент. Файл.list поступает из базы данных sql, поэтому list.files() не будет вариантом. – jrzelling

Смежные вопросы