2011-02-02 9 views
85

Jestem bardzo nowy dla R i pracuję nad aktualizacją skryptu R w celu iteracji poprzez serię tabel .dbf utworzonych przy użyciu ArcGIS i wygenerowania serii wykresów.Używanie R do wypisania wszystkich plików z określonym rozszerzeniem

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. Próbowałem wyszukiwać i eksperymentować z wyrażeń regularnych bez skutku. To jest podstawowe wyrażenie, którego używam (z wyjątkiem wszystkich różnych eksperymentów):

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

Czy ktoś może podać mi jakiś kierunek?

+1

Jeśli masz problemy z wyrażeń regularnych, ale zna wieloznaczny matrycowy, funkcja 'glob2rx()' jest często pomocne. – caracal

+0

Czy to tylko mnie lub jest tytuł wprowadzający w błąd: powinien przeczytać "tylko z określonym rozszerzeniem" (ale nie mogę znaleźć odpowiedzi na SO, aby wyłączyć niektóre rozszerzenia) –

+0

caracal, dzięki za sugestię. jonw, przypuszczam, że mogłem to sformułować bardziej zwięźle, chciałem tylko napisać to przed spotkaniem. – chawkins

Odpowiedz

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

$ na końcu oznacza, że ​​jest to koniec napisu. "dbf$" również będzie działać, ale dodanie \\. (. jest specjalnym znakiem w wyrażeniach regularnych, więc musisz się z niego wydostać) upewnij się, że dopasowujesz tylko pliki z rozszerzeniem .dbf (w przypadku, gdy masz np. Pliki .adbf).

+1

Czy ta wielkość liter ma znaczenie? – nsn

+4

@nsn Tak, ale jeśli chcesz inaczej, to istnieje argument 'ignore.case' funkcji, więc' list.files (pattern = "\\. Dbf $", ignore.case = TRUE) '. I spójrz na stronę pomocy dla tej funkcji ('? List.files') na więcej szczegółów. – Marek

10

Ustalić wzór znaleźć "\\.dbf" na końcu łańcucha za pomocą $ charakter:

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

Jeśli kropka oznacza kropkę z rozszerzenia pliku, nie będzie działać. Pojedynczy znak dopasowany do kropki w wyrażeniu regularnym. – Marek

+0

@Marek też to zauważył. Moje rezerwy kofeiny musiały spaść poniżej progu. –

+0

Hmm powinienem dodać, że '\\' teraz ucieka z '.'. Więc zastanawiam się, dlaczego to zostało odrzucone? –

49

spróbować tego, który wykorzystuje globs zamiast wyrażeń regularnych, więc będzie wybrać tylko nazwy plików, które kończą się w .dbf

6

nie jestem bardzo dobry w użyciu zaawansowanych wyrażeń regularnych, więc zrobiłbym takiego zadania w następujący sposób:

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

Pierwszy wiersz zawiera listę wszystkich plików z działającego reż. Druga z nich upuszcza wszystko, co zawierało ".xml" (grep zwraca indeksy takich łańcuchów w wektorze "files", podsekcja z ujemnymi indeksami usuwa odpowiednie wpisy z wektora). Argument "stały" dla funkcji grep jest tylko moim kaprysem, ponieważ zazwyczaj chcę, aby pojawił się wzór dopasowania wzoru bez wyrażeń w stylu Perla, co może wywołać dla mnie niespodziankę.

Jestem świadomy, że takie rozwiązanie po prostu odzwierciedla wady w mojej edukacji, ale dla początkującego może być przydatne =) przynajmniej jest to łatwe.

+0

Powinieneś usunąć znak '-' przed' grep'. Potrzebowałem tego rodzaju rozwiązania, aby wyodrębnić określone pliki z pliku zip. Najpierw pobierz listę plików w data.frame i pobierz określone pliki i wyodrębnij je później. 'lf <- unzip (plik, lista = T) [, 1]; files.shp <- lf [grep (". Shp", lf, stała = T)] – Sezen

0

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

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