найти соответствующий файл для нескольких условий - PullRequest
0 голосов
/ 17 октября 2018

Я прочитал несколько сообщений здесь для соответствия файла, но мои вопросы не совсем то же самое.

Я пытаюсь найти файл, соответствующий 3 условиям, и все 3 условия представляют собой значение еще одной 3-х переменных в цикле, поэтому похоже, что я не могу напрямую поместить переменную в оператор образца

Вот пример

c1 = "Curr Month"
c2 = "Entity Lst Yr"
c3 = "36008"
file_from = "my_path/"

f = list.files(path = paste0(file_from, "Account/"), pattern = glob2rx(c1*c2*c3))

, и моя ошибка выводится в выражении шаблона

не числовой аргумент для бинарного оператора

Любая идеявысоко ценится, большое спасибо!

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Комментарий Уве может быть самым простым для вас.Если это может быть в любом порядке, то вам нужно быть немного более креативным.

Поскольку у меня нет ваших файлов или чего-то подобного, я создам несколько примеров:

# filelisting <- list.files(path=...) # no pattern
filelisting <- c(
  "Rob travel v1.2.docx",
  "the v1.2 version of travel for Rob.xlsx",
  "the v1.3 version of travel for Rob.xlsx",
  "the v1.2 version of travel for Carol.xlsx",
  "something else entirely.pptx",
  "C_Mu.R",
  "My travel v1.2.txt"
)
c1 <- "Rob"
c2 <- "travel"
c3 <- "v1.2"

Если вам нужны все три, но с учетом разных заказов, то

grepl(paste(c1,c2,c3,sep=".*"), filelisting)
# [1]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE

завершится неудачно, потому что пропустит второй файл.

Вот мысль:

sapply(c(c1,c2,c3), grepl, filelisting)
#        Rob travel  v1.2
# [1,]  TRUE   TRUE  TRUE
# [2,]  TRUE   TRUE  TRUE
# [3,]  TRUE   TRUE FALSE
# [4,] FALSE   TRUE  TRUE
# [5,] FALSE  FALSE FALSE
# [6,] FALSE  FALSE FALSE
# [7,] FALSE   TRUE  TRUE

Отздесь вы можете просто искать строки, в которых все значения имеют значение true, например

apply(sapply(c(c1,c2,c3), grepl, filelisting), 1, all)
# [1]  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE

(используя это для индексации по filelisting).

Вы можете немного обобщить это, еслиможет иметь более трех условий и / или число условий может изменяться.

allcs <- c("Rob", "travel", "v1.2", "docx")
apply(sapply(allcs, grepl, filelisting), 1, all)
# [1]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE

В каждой строке вы можете использовать реальный материал типа regex (что означает, что вам нужно экранировать язык regex):

allcs <- c("Rob", "travel", "v1.2", "xlsx|docx")
apply(sapply(allcs, grepl, filelisting), 1, all)
# [1]  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
0 голосов
/ 17 октября 2018

Вы пытаетесь объединить c1-3 в регулярные выражения с подстановочными знаками между ними?Работает ли ниже?

reg <- glob2rx(paste(c1,c2,c3,sep="*"))
print(reg)

[1] "^Curr Month.*Entity Lst Yr.*36008$"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...