Utilizzo di R per elencare tutti i file con un'estensione specificata


137

Sono molto nuovo di R e sto lavorando sull'aggiornamento di uno script R per iterare attraverso una serie di tabelle .dbf create usando ArcGIS e produrre una serie di grafici.

Ho una directory, C: \ Scratch, che conterrà tutti i miei file .dbf. Tuttavia, quando ArcGIS crea queste tabelle, include anche un file .dbf.xml. Voglio rimuovere questi file .dbf.xml dal mio elenco di file e quindi dalla mia iterazione. Ho provato a cercare e sperimentare espressioni regolari senza alcun risultato. Questa è l'espressione di base che sto usando (Escludendo tutte le varie sperimentazioni):

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

Qualcuno può darmi qualche direzione?


1
Se stai lottando con regexps ma conosci il modello jolly, la funzione glob2rx()è spesso utile.
Caracal,

Sono solo io o il titolo è fuorviante: dovrei leggere "solo con una particolare estensione" (ma non riesco a trovare una risposta su SO per escludere determinate estensioni)
J. Win.

caracal, grazie per il suggerimento. jonw, suppongo che avrei potuto formularlo in modo più sintetico, stavo solo cercando di farlo pubblicare prima di una riunione.
Chawkins,

ha attirato la mia attenzione perché, mentre apprendo su regexp, mi sono chiesto se esiste un modo semplice per escludere. forse merita una domanda separata.
J. Win.

Risposte:


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

$alla fine significa che questa è la fine della stringa. "dbf$"funzionerà anche, ma l'aggiunta \\.( .è un carattere speciale nelle espressioni regolari, quindi è necessario evitarlo) assicurerà di abbinare solo i file con l'estensione .dbf(nel caso in cui tu abbia ad esempio .adbffile).


1
È sensibile al maiuscolo / minuscolo?
nn

6
@nsn Sì, ma se vuoi altrimenti, allora c'è ignore.caseargomento della funzione list.files(pattern = "\\.dbf$", ignore.case=TRUE). E dai un'occhiata alla pagina di aiuto per quella funzione ( ?list.files) per maggiori dettagli.
Marek,

61

Prova questo che usa globs anziché espressioni regolari in modo da scegliere solo i nomi dei file che finiscono .dbf

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

12

Peg lo schema da trovare "\\.dbf"alla fine della stringa usando il $carattere:

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

1
Se punto significa punto dall'estensione del file, non funzionerà. Il punto corrisponde al singolo carattere nell'espressione regolare.
Marek,

@Marek lo ha appena notato. Le mie riserve di caffeina devono essere scese al di sotto di una soglia.
Gavin Simpson,

Hmm avrebbe dovuto aggiungere che \` escape the .` ora. Quindi ci si chiede perché questo sia stato downvoted?
Gavin Simpson,

8

Non sono molto bravo a usare espressioni regolari sofisticate, quindi farei questo compito nel modo seguente:

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

La prima riga elenca solo tutti i file dalla directory di lavoro. Il secondo elimina tutto ciò che contiene ".xml" (grep restituisce gli indici di tali stringhe nel vettore "file"; la sottosezione con indici negativi rimuove le voci corrispondenti dal vettore). L'argomento "risolto" per la funzione grep è solo il mio capriccio, poiché di solito voglio che esegua la corrispondenza del modello grezzo senza regexprs di fantasia in stile Perl, il che potrebbe farmi sorprendere.

Sono consapevole che tale soluzione riflette semplicemente gli svantaggi della mia istruzione, ma per un principiante può essere utile =) almeno è facile.


1
È necessario rimuovere il -segno prima grep. Avevo bisogno di questo tipo di soluzione per estrarre file specifici da un file zip. Innanzitutto, ottieni l'elenco dei file in un data.frame e ottieni file specifici ed estraili in un secondo momento. lf <- unzip(file, list=T)[,1]; files.shp <- lf[grep(".shp", lf, fixed=T)]
Sezen,

5

Ti dà l'elenco dei file con il percorso completo:

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

lunga vita a sys.glob!
Shadi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.