2011-02-02 10 views
85

Soy nuevo en R y estoy trabajando en la actualización de un script R para iterar a través de una serie de tablas .dbf creadas con ArcGIS y producir una serie de gráficos.Uso de R para enumerar todos los archivos con una extensión especificada

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, mi iteración. Intenté 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?

+1

Si usted está luchando con las expresiones regulares pero conoce el comodín de un patrón, función 'glob2rx()' suele ser útil. – caracal

+0

¿Soy yo o el título es engañoso? Debería decir "con solo una extensión en particular" (pero no puedo encontrar una respuesta en SO para excluir ciertas extensiones) –

+0

caracal, gracias por la sugerencia. jonw, supongo que podría haberlo redactado de forma más sucinta, solo estaba tratando de publicarlo antes de una reunión. – chawkins

Respuesta

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

$ al final significa que se trata de final de cadena. "dbf$" también funcionará, pero si agrega \\. (. es un carácter especial en expresiones regulares, por lo que debe evitarlo) asegúrese de hacer coincidir solo los archivos con la extensión .dbf (en caso de que tenga, por ejemplo, .adbf archivos).

+1

¿Es sensible a mayúsculas y minúsculas? – nsn

+4

@nsn Sí, pero si lo desea, existe el argumento 'ignore.case' de la función, por lo que' list.files (pattern = "\\. Dbf $", ignore.case = TRUE) '. Y mira la página de ayuda para esa función ('? List.files') para más detalles. – Marek

10

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

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

Si dot significa punto desde la extensión de archivo, no funcionará. Punto coinciden con un solo carácter en la expresión regular. – Marek

+0

@Marek también lo notó. Mis reservas de cafeína deben haber caído por debajo de un umbral. –

+0

Hmm debería haber agregado que el '\\' escapa del '.' ahora. Entonces, uno se pregunta por qué esto se vino abajo. –

49

probar este que utiliza globos en lugar de expresiones regulares, de modo que sólo se transmiten los nombres de los archivos que terminan en .dbf

6

no soy muy bueno en el uso de expresiones regulares complejas, por lo que me gustaría hacer esta tarea de la siguiente manera:

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

La primera línea simplemente muestra todos los archivos del directorio de trabajo. El segundo arroja todo lo que contiene ".xml" (grep devuelve índices de tales cadenas en el vector 'files'; el subconjunto con índices negativos elimina las entradas correspondientes del vector). El argumento "fijo" para la función grep es simplemente mi capricho, ya que generalmente quiero que pepe la coincidencia de patrones crudos sin los regexprs sofisticados estilo Perl, lo que puede causar sorpresa para mí.

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

+0

Debe eliminar el signo '-' antes de' 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 <- descomprimir (archivo, lista = T) [, 1]; files.shp <- lf [grep (". Shp", lf, fixed = T)] ' – Sezen

0

le da la lista de archivos con la ruta completa:

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