1
votes

Renommer des fichiers en fonction des répertoires parents avec des noms de fichiers spécifiques dans R

il s'agit d'un suivi du fil de discussion précédent ici . J'ai le même objectif, mais avec un léger ajustement.

Donc, en supposant un nouveau vecteur de noms de fichiers

str_match_all("D:/example/(.+)/(.+)/OD/CD/*blue*") %>%

Comment ajusterais-je ce code

str_match_all("D:/example/(.+)/(.+)/OD/CD/(.+)") %>%

pour que je puisse sélectionner uniquement les fichiers qui ont bleu quelque part dans le nom de fichier? J'avais essayé d'ajuster cette ligne

library(stringr)
library(magrittr)

all_dirs <-
  c("D:/example/sub1/session1/OD/CD/text.txt",
    "D:/example/sub2/session1/OD/CD/text.txt",
    "D:/example/sub3/session1/OD/CD/text.txt")

new_dirs <-
  all_dirs %>%
  # Match each group using regex
  str_match_all("D:/example/(.+)/(.+)/OD/CD/(.+)") %>%
  # Paste the matched groups into one path
  vapply(function(x) paste0(x[2:4], collapse = "_"), character(1)) %>%
  paste0("D:/all_files/", .)

# Copy them.
file.copy(all_dirs, new_dirs)

pour dire à la place

c("D:/example/sub1/session1/OD/CD/adsfadfadsfadfadf_blue.txt", "D:/example/sub2/session1/OD/CD/text.txt", 
"D:/example/sub3/session1/OD/CD/text.txt")

mais cela ne semblait pas fonctionner. De plus, l'objectif principal reste le même que le post précédent. Je veux que le nom de fichier complet soit conservé.


0 commentaires

3 Réponses :


3
votes

Désolé, je ne connais pas R, mais que diriez-vous de:

str_match_all("D:/example/(.+)/(.+)/OD/CD/(.*blue[^/]*)") %>%

Si l'expression régulière dans R se comporte comme dans d'autres moteurs / langues, alors le. + correspondra à un ou plusieurs des personnage. Donc, peut potentiellement correspondre à plusieurs niveaux dans la hiérarchie des répertoires. Le. * Correspondra à zéro ou plus de n'importe quel caractère. Le [^ /] * correspondra à zéro ou plus de tout caractère qui n'est pas une barre oblique.

J'espère que cela vous aidera ... vous voudrez peut-être changer tous vos. + Ou. * En [^ / ] + ou [^ /] * si vous souhaitez limiter cette section de l'URL à un seul niveau de répertoire.


0 commentaires

1
votes

Nous pouvons utiliser grep pour filtrer d'abord les valeurs, puis continuer la même approche

all_dirs <- c("D:/example/sub1/session1/OD/CD/adsfadfadsfadfadf_blue.txt", 
              "D:/example/sub2/session1/OD/CD/text.txt", 
              "D:/example/sub3/session1/OD/CD/text.txt")

data

new_dirs <- grep('blue', all_dirs, value = TRUE) %>%
               stringr::str_match_all("D:/example/(.+)/(.+)/OD/CD/(.+)") %>%
               vapply(function(x) paste0(x[2:4], collapse = "_"), character(1)) %>%
               paste0("D:/all_files/", .)

new_dirs
 #[1] "D:/all_files/sub1_session1_adsfadfadsfadfadf_blue.txt"


0 commentaires

0
votes

C'est peut-être une autre solution.

Demande initiale de traitement en modifiant le motif.

Puis, en tournant " bleu " en "(. bleu. em>) ".

" blue "signifie que les textes de visée obtiennent le nom de fichier qui ne contient que" blue ".

" (. blue. ) "signifie la chaîne cible de quatre types.

Il y a quatre exemples.

  1. uniquement "bleu".

  2. "bluewud".

  3. "Dhublue".

  4. "Dueblue72yd".

new_dirs <-
  all_dirs %>%
  # Match each group using regex
  str_match_all("D:/example/(.+)/(.+)/OD/CD/(.*blue.*)") %>%  
# Paste the matched groups into one path
  vapply(function(x){paste0(x[2:4], collapse = "_")%>%paste0(x[1],.)},character(1)) %>% 
  grep(pattern = "D:",value = T)


0 commentaires