167 votes

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

Je suis très nouveau sur R et je travaille à mettre à jour un script R pour itérer à travers 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 veux supprimer ces fichiers .dbf.xml de ma liste de fichiers et donc de mon itération. J'ai essayé de chercher et d'expérimenter avec des expressions régulières en vain. Voici l'expression de base que j'utilise (en excluant toutes les expérimentations variées) :

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

Quelqu'un peut-il me donner une direction?

2 votes

Si vous avez du mal avec les regexps mais connaissez le motif de joker, la fonction glob2rx() est souvent utile.

0 votes

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

0 votes

Caracal, merci pour la suggestion. jonw, je suppose que j'aurais pu le formuler de manière plus concise, j'essayais juste de le poster avant une réunion.

254voto

Marek Points 18000
files <- list.files(pattern = "\\.dbf$")

$ à la fin signifie que c'est la fin de la chaîne. "dbf$" fonctionne également, mais en ajoutant \\. (. est un caractère spécial dans les expressions régulières, il faut donc l'échapper), vous vous assurez de ne faire correspondre que des fichiers avec l'extension .dbf (dans le cas où vous avez par exemple des fichiers .adbf).

Pour ignorer la casse, utilisez :

files <- list.files(pattern = "\\.dbf$", ignore.case = TRUE)

pour correspondre par exemple à : FILE.DBF.

1 votes

Est-ce que c'est sensible à la casse ?

10 votes

@nsn Oui, mais si vous le souhaitez autrement, il y a l'argument ignore.case de la fonction, donc list.files(pattern = "\\.dbf$", ignore.case=TRUE). Et consultez la page d'aide de cette fonction (?list.files) pour plus de détails.

68voto

G. Grothendieck Points 40825

Essayez ceci qui utilise des globales plutôt que des expressions régulières afin de ne choisir que les noms de fichiers se terminant par .dbf

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

13voto

Gavin Simpson Points 72349

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

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

1 votes

Si dot signifie un point dans l'extension de fichier, cela ne fonctionnera pas. Dot matche un seul caractère dans une expression régulière.

0 votes

@Marek vient de remarquer ça aussi. Mes réserves de caféine doivent être tombées en dessous d'un seuil.

0 votes

Il aurait dû ajouter que le \` échappe le . À présent, on se demande pourquoi cela a été downvoté ?

11voto

Surya Points 4152

Vous donne la liste des fichiers avec le chemin complet :

  Sys.glob(file.path(file_dir, "*.dbf")) ## file_dir = fichier contenant le répertoire

8voto

donshikin Points 476

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

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

La première ligne liste simplement tous les fichiers du répertoire de travail. La deuxième supprime tout ce qui contient ".xml" (grep renvoie les indices de ces chaînes dans le vecteur 'files'; la sous-sélection avec des indices négatifs supprime les entrées correspondantes du vecteur). L'argument "fixed" pour la fonction grep est juste un caprice de ma part, car je veux généralement qu'il effectue une correspondance de modèle grossière sans les expressions régulières de style Perl, qui pourraient me causer des surprises.

Je suis conscient que cette solution simplement reflète les lacunes dans mon éducation, mais pour un novice, cela pourrait être utile =) au moins, c'est facile.

1 votes

Vous devriez 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 pour les extraire plus tard. lf <- unzip(file, list=T)[,1]; files.shp <- lf[grep(".shp", lf, fixed=T)]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X