#r #stringr
#r #stringr
Вопрос:
У меня есть файлы, которые называются
value<-c("ABC_Seed_1_0.csv", "ABC_Seed_1_1.csv", "ABC_Seed_10_0.csv", "ABC_Seed_10_1.csv")
Я хотел бы найти и удалить только файлы, принадлежащие file: seed_1.tar.xz (т.Е. Найти все файлы с именем ACB_Seed_1_*.csv)
Проблема в том, что если я буду искать seed_1, я также получу seed_10. Есть ли в этом какой-то подвох?
Я пробовал добавлять «_» с помощью paste0
#Available files
value<-c("ABC_Seed_1_0.csv", "ABC_Seed_1_1.csv", "ABC_Seed_10_0.csv", "ABC_Seed_10_1.csv")
library(dplyr)
library(tidyr)
#File to match against (minus extension)
file<-c("seed_10.tar.xz")
ListToDelete<- value %>%
as_tibble %>%
filter(value,
stringr::str_detect(string = value, pattern = paste0(fixed(tools::file_path_sans_ext(file, compression = TRUE),ignore_case = TRUE),"_"))
#Returns an empty tibble
file.remove(ListToDelete)
Комментарии:
1. Для этого определенно есть регулярное выражение, но вы также можете использовать
stringr::word()
, т.е.stringr::word(value, 3, sep = '_') == '1'
2. Используя регулярное выражение Тима, вы также можете использовать
grep("ABC_Seed_1_\d .csv", value, value = TRUE)
Ответ №1:
Возможно, вы делаете это более сложным, чем нужно. В базе R я бы просто использовал grepl
здесь:
value[grepl("ABC_Seed_1_\d .csv", value)]
[1] "ABC_Seed_1_0.csv" "ABC_Seed_1_1.csv"
Данные:
value <- c("ABC_Seed_1_0.csv", "ABC_Seed_1_1.csv",
"ABC_Seed_10_0.csv", "ABC_Seed_10_1.csv")
Комментарии:
1. Спасибо, Тим, ты прав, я всегда все усложняю. Я ищу find seed_1 из имени файла seed_1.tar.xz в векторе значений, так как бы мне поместить его в эту функцию grepl? Здесь вы ввели определенную строку, но сначала мне нужно разделить seed_1.tar.xz, а затем ввести ее, нет? Я должен уточнить, что все это находится в цикле for, поэтому позже мне нужно будет извлечь все файлы, принадлежащие seed_10 и т.д. (извините, если это было непонятно)
Ответ №2:
Чтобы улучшить предыдущий ответ … предполагая, что ваши имена файлов являются стандартными, сначала разделите входные данные, используя strsplit
и извлеките начальный номер, затем используйте grepl
, как предложено.
Например.
value[grepl(paste("Seed_",as.numeric(strsplit(file, "[_|.]")[[1]][2]),"_",sep=""), value, fixed=TRUE)]
Комментарии:
1. Спасибо. Однако это возвращает все мои файлы. Я хочу только seed_1 или seed_10, а не оба.
2. Это странно, но здесь все работает так, как задумано. Оба
grepl
символа подчеркивания, как предыдущий, так и следующий, должны устранить любую двусмысленность.3. Ах, мне так жаль, я совершила ошибку. Мои файлы tar csv — это ABC_Seed1_0.tar.xz
4. Хорошо, так что, если я уберу первое _, это сработает
5. Отлично, значит, путаница решена 🙂 Действительно стоит изучить некоторые основы регулярных выражений для решения такого рода проблем,
grep
семья очень полезна.