Użycie R do wyświetlenia wszystkich plików z określonym rozszerzeniem

139

Jestem bardzo nowy w R i pracuję nad aktualizacją skryptu R, aby iterował przez serię tabel .dbf utworzonych za pomocą ArcGIS i tworzył serię wykresów.

Mam katalog C: \ Scratch, który będzie zawierał wszystkie moje pliki .dbf. Jednak gdy ArcGIS tworzy te tabele, zawiera również plik .dbf.xml. Chcę usunąć te pliki .dbf.xml z mojej listy plików, a tym samym z mojej iteracji. Bezskutecznie próbowałem wyszukiwać i eksperymentować z wyrażeniami regularnymi. Oto podstawowe wyrażenie, którego używam (z wyłączeniem wszystkich różnych eksperymentów):

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

Czy ktoś może mi dać jakieś wskazówki?

chawkins
źródło
1
Jeśli zmagasz się z wyrażeniami regularnymi, ale znasz wzorzec symboli wieloznacznych, funkcja glob2rx()jest często pomocna.
karakal
Czy to tylko ja, czy tytuł wprowadza w błąd: powinien brzmieć „tylko z określonym rozszerzeniem” (ale nie mogę znaleźć odpowiedzi na SO na wykluczenie niektórych rozszerzeń)
J. Win.
caracal, dzięki za sugestię. jonw, przypuszczam, że mógłbym to sformułować bardziej zwięźle, po prostu chciałem to opublikować przed spotkaniem.
chawkins
zwróciło to moją uwagę, ponieważ kiedy dowiaduję się o wyrażeniu regularnym, zastanawiałem się, czy istnieje łatwy sposób wykluczenia. może zasługuje na osobne pytanie.
J. Win.

Odpowiedzi:

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

$na końcu oznacza, że ​​jest to koniec łańcucha. "dbf$"też zadziała, ale dodawanie \\.( .jest to znak specjalny w wyrażeniach regularnych, więc musisz go uciec) upewnij się, że dopasujesz tylko pliki z rozszerzeniem .dbf(w przypadku, gdy masz np. .adbfpliki).

Marek
źródło
1
Czy wielkość liter ma znaczenie?
nsn
6
@nsn Tak, ale jeśli chcesz inaczej, jest ignore.caseargument funkcji, więc list.files(pattern = "\\.dbf$", ignore.case=TRUE). Spójrz na stronę pomocy dla tej funkcji ( ?list.files), aby uzyskać więcej informacji.
Marek
62

Spróbuj tego, który używa globów zamiast wyrażeń regularnych, więc wybierze tylko nazwy plików kończące się na .dbf

filenames <- Sys.glob("*.dbf")
G. Grothendieck
źródło
12

Ustal wzór, aby znaleźć "\\.dbf"na końcu ciągu, używając $znaku:

list.files(pattern = "\\.dbf$")
Gavin Simpson
źródło
1
Jeśli kropka oznacza kropkę z rozszerzenia pliku, to nie zadziała. Kropka pasuje do pojedynczego znaku w wyrażeniu regularnym.
Marek
@Marek też to zauważył. Moje rezerwy kofeiny musiały spaść poniżej progu.
Gavin Simpson
Hmm powinienem dodać, że \` escape the .` teraz. Więc można się zastanawiać, dlaczego ten głos został odrzucony?
Gavin Simpson,
8

Nie jestem dobry w używaniu wyrafinowanych wyrażeń regularnych, więc wykonałbym takie zadanie w następujący sposób:

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

Pierwsza linia zawiera tylko wszystkie pliki z katalogu roboczego. Drugi usuwa wszystko, co zawiera „.xml” (grep zwraca indeksy takich ciągów w wektorze „plików”; podzestawianie indeksami ujemnymi usuwa odpowiednie wpisy z wektora). Argument „ustalony” dla funkcji grep jest po prostu moim kaprysem, ponieważ zwykle chcę, aby spełniała ona surowe dopasowanie wzorców bez fantazyjnych wyrażeń regularnych w stylu Perla, co może mnie zaskoczyć.

Zdaję sobie sprawę, że takie rozwiązanie po prostu odzwierciedla wady mojej edukacji, ale dla nowicjusza może się przydać =) przynajmniej jest łatwe.

donshikin
źródło
1
Powinieneś wcześniej usunąć -znak grep. Potrzebowałem takiego rozwiązania, aby wyodrębnić określone pliki z pliku zip. Najpierw pobierz listę plików w data.frame, pobierz określone pliki i wyodrębnij je później. lf <- unzip(file, list=T)[,1]; files.shp <- lf[grep(".shp", lf, fixed=T)]
Sezen,
5

Wyświetla listę plików z pełną ścieżką:

  Sys.glob(file.path(file_dir, "*.dbf")) ## file_dir = file containing directory
Surya
źródło
niech żyje sys.glob!
shadi