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.