Verwenden von R zum Auflisten aller Dateien mit einer angegebenen Erweiterung


136

Ich bin sehr neu in R und arbeite daran, ein R-Skript zu aktualisieren, um eine Reihe von mit ArcGIS erstellten DBF-Tabellen zu durchlaufen und eine Reihe von Diagrammen zu erstellen.

Ich habe ein Verzeichnis, C: \ Scratch, das alle meine .dbf-Dateien enthält. Wenn ArcGIS diese Tabellen erstellt, enthält es jedoch auch eine .dbf.xml-Datei. Ich möchte diese .dbf.xml-Dateien aus meiner Dateiliste und damit meiner Iteration entfernen. Ich habe erfolglos versucht, mit regulären Ausdrücken zu suchen und zu experimentieren. Dies ist der grundlegende Ausdruck, den ich verwende (mit Ausnahme aller verschiedenen Experimente):

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

Kann mir jemand eine Richtung geben?


1
Wenn Sie mit regulären Ausdrücken zu kämpfen haben, aber das Platzhaltermuster kennen, ist die Funktion glob2rx()oft hilfreich.
Caracal

Ist es nur ich oder ist der Titel irreführend: sollte "nur mit einer bestimmten Erweiterung" lauten (aber ich kann auch keine Antwort auf SO finden, um bestimmte Erweiterungen auszuschließen)
J. Win.

Caracal, danke für den Vorschlag. jonw, ich hätte es wohl prägnanter formulieren können, ich habe nur versucht, es vor einem Meeting zu veröffentlichen.
Chawkins

Es erregte meine Aufmerksamkeit, weil ich mich beim Erlernen von Regexp gefragt habe, ob es einen einfachen Weg gibt, dies auszuschließen. verdient vielleicht eine gesonderte Frage.
J. Win.

Antworten:


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

$am Ende bedeutet, dass dies das Ende der Zeichenfolge ist. "dbf$"funktioniert auch, aber das Hinzufügen \\.( .ist ein Sonderzeichen in regulären Ausdrücken, sodass Sie es maskieren müssen) stellt sicher, dass Sie nur Dateien mit der Erweiterung abgleichen .dbf(falls Sie zB .adbfDateien haben).


1
Ist das Groß- und Kleinschreibung?
nsn

6
@nsn Ja, aber wenn Sie etwas anderes wollen, dann gibt es ein ignore.caseArgument für die Funktion, also list.files(pattern = "\\.dbf$", ignore.case=TRUE). ?list.filesWeitere Informationen finden Sie auf der Hilfeseite für diese Funktion ( ).
Marek

61

Versuchen Sie dies, bei dem Globs anstelle von regulären Ausdrücken verwendet werden, sodass nur die Dateinamen ausgewählt werden, die auf enden .dbf

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

12

Befestigen Sie das Muster "\\.dbf"am Ende der Zeichenfolge mit dem folgenden $Zeichen:

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

1
Wenn Punkt Punkt aus Dateierweiterung bedeutet, funktioniert dies nicht. Punktübereinstimmung mit einem einzelnen Zeichen im regulären Ausdruck.
Marek

@Marek hat das auch gerade bemerkt. Meine Koffeinreserven müssen unter eine Schwelle gefallen sein.
Gavin Simpson

Hmm hätte das jetzt hinzufügen sollen \` escape the .` jetzt. Man wundert sich also, warum dies abgelehnt wurde?
Gavin Simpson

8

Ich bin nicht sehr gut darin, ausgefeilte reguläre Ausdrücke zu verwenden, daher würde ich diese Aufgabe folgendermaßen ausführen:

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

In der ersten Zeile werden nur alle Dateien aus dem Arbeitsverzeichnis aufgelistet. Zweitens wird alles gelöscht, was ".xml" enthält (grep gibt Indizes solcher Zeichenfolgen im Vektor 'files' zurück; eine Untermenge mit negativen Indizes entfernt entsprechende Einträge aus dem Vektor). Das "feste" Argument für die grep-Funktion ist nur meine Laune, da ich normalerweise möchte, dass es einen groben Mustervergleich ohne ausgefallene reguläre Ausdrücke im Perl-Stil durchführt, was für mich eine Überraschung sein kann.

Ich bin mir bewusst, dass eine solche Lösung einfach Nachteile in meiner Ausbildung widerspiegelt, aber für einen Anfänger kann sie nützlich sein =) Zumindest ist es einfach.


1
Sie sollten das -Zeichen vorher entfernen grep. Ich brauchte eine solche Lösung, um bestimmte Dateien aus einer Zip-Datei zu extrahieren. Rufen Sie zuerst die Dateiliste in einem data.frame ab, rufen Sie bestimmte Dateien ab und extrahieren Sie sie später. lf <- unzip(file, list=T)[,1]; files.shp <- lf[grep(".shp", lf, fixed=T)]
Sezen

5

Gibt Ihnen die Liste der Dateien mit vollständigem Pfad:

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

Es lebe sys.glob!
Shadi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.