R: найти файлы, содержащие точное совпадение строк, за которым следует только _ (игнорировать регистр)

#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 семья очень полезна.