Usando R para enumerar todos los archivos con una extensión especificada

137

Soy muy nuevo en R y estoy trabajando en actualizar un script R para iterar a través de una serie de tablas .dbf creadas usando ArcGIS y producir una serie de gráficos.

Tengo un directorio, C: \ Scratch, que contendrá todos mis archivos .dbf. Sin embargo, cuando ArcGIS crea estas tablas, también incluye un archivo .dbf.xml. Quiero eliminar estos archivos .dbf.xml de mi lista de archivos y, por lo tanto, de mi iteración. He intentado buscar y experimentar con expresiones regulares en vano. Esta es la expresión básica que estoy usando (excluyendo todos los diversos experimentos):

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

¿Alguien puede darme alguna dirección?

Chawkins
fuente
1
Si está luchando con expresiones regulares pero conoce el patrón comodín, la función a glob2rx()menudo es útil.
caracal
¿Soy solo yo o el título es engañoso: debería leer "solo con una extensión particular" (pero tampoco puedo encontrar una respuesta en SO para excluir ciertas extensiones)
J. Win.
caracal, gracias por la sugerencia. jonw, supongo que podría haberlo redactado de manera más sucinta, solo estaba tratando de publicarlo antes de una reunión.
Chawkins 02 de
Me llamó la atención porque a medida que aprendo sobre regexp, me preguntaba si hay una manera fácil de excluir. tal vez merece una pregunta por separado.
J. Win.

Respuestas:

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

$al final significa que este es el final de la cadena. "dbf$"también funcionará, pero al agregar \\.( .es un carácter especial en las expresiones regulares, por lo que debe escapar), asegúrese de que solo coincida con los archivos con extensión .dbf(en caso de que tenga, por ejemplo, .adbfarchivos).

Marek
fuente
1
¿Es ese caso sensible?
nsn
66
@nsn Sí, pero si quieres lo contrario, entonces hay un ignore.caseargumento de la función, entonces list.files(pattern = "\\.dbf$", ignore.case=TRUE). Y mire en la página de ayuda para esa función ( ?list.files) para más detalles.
Marek
61

Pruebe esto, que usa globos en lugar de expresiones regulares, por lo que solo seleccionará los nombres de archivo que terminan en .dbf

filenames <- Sys.glob("*.dbf")
G. Grothendieck
fuente
12

Peg el patrón para encontrar "\\.dbf"al final de la cadena usando el $carácter:

list.files(pattern = "\\.dbf$")
Gavin Simpson
fuente
1
Si punto significa punto de la extensión del archivo, no funcionará. Punto coinciden con un solo carácter en expresión regular.
Marek
@Marek también se dio cuenta de eso. Mis reservas de cafeína deben haber caído por debajo de un umbral.
Gavin Simpson
Hmm debería haber agregado que el \` escape the .` ahora. ¿Entonces uno se pregunta por qué esto se votó negativamente?
Gavin Simpson
8

No soy muy bueno en el uso de expresiones regulares sofisticadas, por lo que haría esa tarea de la siguiente manera:

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

La primera línea solo enumera todos los archivos del directorio de trabajo. El segundo descarta todo lo que contiene ".xml" (grep devuelve índices de tales cadenas en el vector 'archivos'; el subconjunto con índices negativos elimina las entradas correspondientes del vector). El argumento "fijo" para la función grep es solo mi capricho, ya que generalmente quiero que realice una coincidencia de patrones crudos sin expresiones regulares elegantes de Perl, lo que puede sorprenderme.

Soy consciente de que tal solución simplemente refleja inconvenientes en mi educación, pero para un novato puede ser útil =) al menos es fácil.

donshikin
fuente
1
Debes eliminar el -signo antes grep. Necesitaba este tipo de solución para extraer archivos específicos de un archivo zip. Primero, obtenga la lista de archivos en un data.frame y obtenga archivos específicos y extráigalos más tarde. lf <- unzip(file, list=T)[,1]; files.shp <- lf[grep(".shp", lf, fixed=T)]
Sezen
5

Le da la lista de archivos con ruta completa:

  Sys.glob(file.path(file_dir, "*.dbf")) ## file_dir = file containing directory
Surya
fuente
¡Viva sys.glob!
Shadi