Utilisation de R pour lister tous les fichiers avec une extension spécifiée


137

Je suis très nouveau dans R et je travaille sur la mise à jour d'un script R pour parcourir une série de tables .dbf créées à l'aide d'ArcGIS et produire une série de graphiques.

J'ai un répertoire, C: \ Scratch, qui contiendra tous mes fichiers .dbf. Cependant, lorsque ArcGIS crée ces tables, il inclut également un fichier .dbf.xml. Je souhaite supprimer ces fichiers .dbf.xml de ma liste de fichiers et donc de mon itération. J'ai essayé de rechercher et d'expérimenter des expressions régulières en vain. C'est l'expression de base que j'utilise (à l'exclusion de toutes les différentes expériences):

files <- list.files(pattern = "dbf")

Quelqu'un peut-il me donner une direction?


1
Si vous avez du mal avec les expressions rationnelles mais que vous connaissez le modèle générique, la fonction glob2rx()est souvent utile.
caracal le

Est-ce juste moi ou le titre est-il trompeur: devrait se lire "avec seulement une extension particulière" (mais je ne trouve pas non plus de réponse sur SO pour exclure certaines extensions)
J. Win.

caracal, merci pour la suggestion. jonw, je suppose que j'aurais pu le formuler plus succinctement, j'essayais simplement de le publier avant une réunion.
chawkins

cela a attiré mon attention car en apprenant les expressions rationnelles, je me suis demandé s'il y avait un moyen facile d'exclure. mérite peut-être une question distincte.
J. Win.

Réponses:


198
files <- list.files(pattern = "\\.dbf$")

$à la fin signifie que c'est la fin de la chaîne. "dbf$"fonctionnera aussi, mais l'ajout \\.( .c'est un caractère spécial dans les expressions régulières donc vous devez l'échapper) assurez-vous de ne faire correspondre que les fichiers avec l'extension .dbf(au cas où vous auriez par exemple des .adbffichiers).


1
Est-ce sensible à la casse?
nsn

6
@nsn Oui, mais si vous voulez le contraire, il y a un ignore.caseargument de la fonction, donc list.files(pattern = "\\.dbf$", ignore.case=TRUE). Et regardez la page d'aide pour cette fonction ( ?list.files) pour plus de détails.
Marek

61

Essayez ceci qui utilise des globes plutôt que des expressions régulières pour ne sélectionner que les noms de fichiers qui se terminent par .dbf

filenames <- Sys.glob("*.dbf")

12

Peg le motif à trouver "\\.dbf"à la fin de la chaîne en utilisant le $caractère:

list.files(pattern = "\\.dbf$")

1
Si point signifie point de l'extension de fichier, cela ne fonctionnera pas. Le point correspond à un caractère unique dans une expression régulière.
Marek

@Marek vient de le remarquer aussi. Mes réserves de caféine doivent avoir chuté en dessous d'un seuil.
Gavin Simpson le

Hmm aurait dû ajouter que le \` escape the .` maintenant. Alors on se demande pourquoi cela a été déclassé?
Gavin Simpson

8

Je ne suis pas très doué pour utiliser des expressions régulières sophistiquées, donc je ferais une telle tâche de la manière suivante:

files <- list.files()
dbf.files <- files[-grep(".xml", files, fixed=T)]

La première ligne répertorie simplement tous les fichiers du répertoire de travail. La seconde supprime tout ce qui contient ".xml" (grep renvoie les indices de ces chaînes dans le vecteur 'files'; le sous-ensemble avec des indices négatifs supprime les entrées correspondantes du vecteur). L'argument "fixe" pour la fonction grep n'est que mon caprice, car je veux généralement qu'il effectue une correspondance de motif grossière sans regexprs fantaisie de style Perl, ce qui peut me surprendre.

Je suis conscient qu'une telle solution reflète simplement des inconvénients dans mon éducation, mais pour un novice cela peut être utile =) au moins c'est facile.


1
Vous devez supprimer le -signe avant grep. J'avais besoin de ce genre de solution pour extraire des fichiers spécifiques d'un fichier zip. Tout d'abord, obtenez la liste des fichiers dans un data.frame et obtenez des fichiers spécifiques et extrayez-les plus tard. lf <- unzip(file, list=T)[,1]; files.shp <- lf[grep(".shp", lf, fixed=T)]
Sezen le

5

Vous donne la liste des fichiers avec le chemin complet:

  Sys.glob(file.path(file_dir, "*.dbf")) ## file_dir = file containing directory

vive sys.glob!
shadi
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.