2011-02-02 34 views
85

Tôi rất mới với R và đang làm việc để cập nhật tập lệnh R để lặp qua một loạt các bảng .dbf được tạo bằng ArcGIS và tạo một chuỗi biểu đồ.Sử dụng R để liệt kê tất cả các tệp có phần mở rộng được chỉ định

Tôi có một thư mục, C: \ Scratch, sẽ chứa tất cả các tệp .dbf của tôi. Tuy nhiên, khi ArcGIS tạo ra các bảng này, nó cũng bao gồm một tệp .dbf.xml. Tôi muốn xóa các tệp .dbf.xml này khỏi danh sách tệp của mình và do đó tôi lặp lại. Tôi đã thử tìm kiếm và thử nghiệm với các biểu thức chính quy để không có kết quả. Đây là biểu thức cơ bản tôi đang sử dụng (Loại trừ tất cả các thử nghiệm khác nhau):

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

Có thể cho tôi một số hướng không?

+1

Nếu bạn đang phải vật lộn với regexps nhưng biết wildcard-mô hình, chức năng 'glob2rx() 'là thường hữu ích. – caracal

+0

Chỉ là tôi hoặc là tiêu đề gây hiểu lầm: nên đọc "chỉ với một phần mở rộng cụ thể" (nhưng tôi không thể tìm thấy câu trả lời trên SO để loại trừ một số tiện ích mở rộng nhất định) –

+0

caracal, cảm ơn đề xuất. jonw, tôi cho rằng tôi có thể nói nó ngắn gọn hơn, tôi chỉ cố gắng đăng nó trước một cuộc họp. – chawkins

Trả lời

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

$ ở cuối có nghĩa là kết thúc chuỗi. "dbf$" cũng sẽ hoạt động, nhưng thêm \\. (. là ký tự đặc biệt trong biểu thức chính quy, do đó bạn cần thoát khỏi nó) đảm bảo rằng bạn chỉ khớp các tệp với tiện ích mở rộng .dbf (trong trường hợp bạn có các tệp .adbf).

+1

Trường hợp đó có nhạy cảm không? – nsn

+4

@nsn Có, nhưng nếu bạn muốn nếu không thì có đối số 'ignore.case' của hàm, vì vậy' list.files (pattern = "\\. Dbf $", ignore.case = TRUE) '. Và hãy xem trang trợ giúp cho hàm đó ('? List.files') để biết thêm chi tiết. – Marek

10

Peg mô hình để tìm "\\.dbf" ở phần cuối của chuỗi bằng cách sử dụng $ nhân vật:

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

Nếu dấu chấm có nghĩa là dấu chấm từ đuôi tệp thì nó sẽ không hoạt động. Dot khớp với ký tự đơn trong biểu thức chính quy. – Marek

+0

@Marek cũng nhận thấy điều đó. Trữ lượng caffeine của tôi phải giảm xuống dưới ngưỡng. –

+0

Hmm nên đã thêm rằng '\\' thoát '.' ngay bây giờ. Vì vậy, một trong những thắc mắc tại sao điều này đã downvoted? –

49

Cố gắng này trong đó sử dụng những đống chứ không phải là biểu thức thông thường vì vậy nó chỉ sẽ chọn ra tên tập tin kết thúc bằng .dbf

6

tôi không phải là rất tốt trong việc sử dụng biểu thức thông thường phức tạp, vì vậy tôi sẽ làm nhiệm vụ đó theo cách sau:

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

Dòng đầu tiên chỉ liệt kê tất cả các tệp từ thư mục hoạt động. Thứ hai một giọt tất cả mọi thứ có chứa ".xml" (grep trả về các chỉ số của các chuỗi như vậy trong vector 'files'; subs subsices với các chỉ mục tiêu cực loại bỏ các mục tương ứng từ vector). "cố định" đối số cho chức năng grep chỉ là ý thích của tôi, như tôi thường muốn nó để phù hợp với mô hình thô phù hợp mà không có regexprs ưa thích phong cách Perl, có thể gây ra bất ngờ cho tôi.

Tôi biết rằng giải pháp đó đơn giản chỉ phản ánh những hạn chế trong giáo dục của tôi, nhưng đối với người mới, nó có thể hữu ích =) ít nhất cũng dễ dàng.

+0

Bạn nên xóa ký hiệu '-' trước' grep'. Tôi cần loại giải pháp này để trích xuất các tệp cụ thể từ tệp zip. Đầu tiên, lấy danh sách tập tin trong một data.frame và nhận được các tập tin cụ thể và giải nén chúng sau này. 'lf <- giải nén (tệp, danh sách = T) [, 1]; files.shp <- lf [grep (". Shp", lf, fixed = T)] ' – Sezen

0

Cung cấp cho bạn danh sách các file với đường dẫn đầy đủ:

Sys.glob(file.path(file_dir, "*.dbf")) ## file_dir = file containing directory 
Các vấn đề liên quan