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?


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).


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")

12

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

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

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.


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

niech żyje sys.glob!
shadi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.