Sử dụng R để liệt kê tất cả các tệp có phần mở rộng được chỉ định


136

Tôi rất mới với R và đang nghiên cứu 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 ra một loạt các biểu đồ.

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 các bảng này, nó cũng bao gồm 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 đó lặp lại. Tôi đã thử tìm kiếm và thử nghiệm các biểu thức thông thường nhưng không có kết quả. Đây là biểu thức cơ bản tôi đang sử dụng (Không bao gồm tất cả các thử nghiệm khác nhau):

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

Bất cứ ai có thể cho tôi một số hướng?


1
Nếu bạn đang vật lộn với regexps nhưng biết mẫu ký tự đại diện, chức năng glob2rx()thường hữu ích.
caracal

Có phải chỉ tôi hay 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ố phần mở rộng nhất định)
J. Win.

caracal, cảm ơn cho lời đề nghị. 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 để nó được đăng trước một cuộc họp.
chawkins

nó thu hút sự chú ý của tôi bởi vì khi tôi tìm hiểu về regrec, tôi đã tự hỏi liệu có một cách dễ dàng để loại trừ. có lẽ xứng đáng một câu hỏi riêng biệt.
J. Thắng.

Câu trả lời:


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

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


1
Là trường hợp nhạy cảm?
nsn

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

61

Hãy thử cái này sử dụng các cụm từ thay vì các biểu thức thông thường để nó chỉ chọn ra các tên tệp kết thúc bằng .dbf

filenames <- Sys.glob("*.dbf")

12

Chốt mẫu cần tìm "\\.dbf"ở cuối chuỗi bằng $ký tự:

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

1
Nếu dấu chấm có nghĩa là dấu chấm từ phần mở rộng tập tin thì nó sẽ không hoạt động. Dot phù hợp với nhân vật duy nhất trong biểu thức thông thường.
Marek

@Marek cũng nhận thấy điều đó. Dự trữ caffeine của tôi phải giảm xuống dưới một ngưỡng.
Gavin Simpson

Hmm nên đã thêm rằng \` escape the .` bây giờ. Vì vậy, một người tự hỏi tại sao điều này đã bị hạ cấp?
Gavin Simpson

8

Tôi không giỏi sử dụng các biểu thức chính quy phức tạp, vì vậy tôi sẽ thực hiện công việc đó 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 tin từ thư mục làm việc. Cái thứ hai loại bỏ mọi thứ có chứa ".xml" (grep trả về các chỉ số của các chuỗi như vậy trong vectơ 'tập tin; tập hợp lại với các chỉ số âm sẽ loại bỏ các mục tương ứng khỏi vectơ). Đối số "đã sửa" cho hàm grep chỉ là ý thích của tôi, vì tôi thường muốn nó thực hiện khớp mẫu thô mà không có biểu thức chính quy ưa thích kiểu Perl, điều này có thể gây bất ngờ cho tôi.

Tôi biết rằng giải pháp như vậy chỉ đơn giản 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 là dễ dàng.


1
Bạn nên loại bỏ -dấu 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 trong data.frame và lấy các tệp cụ thể và giải nén chúng sau. lf <- unzip(file, list=T)[,1]; files.shp <- lf[grep(".shp", lf, fixed=T)]
Sezen

5

Cung cấp cho bạn danh sách các tệp có đường dẫn đầy đủ:

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

sys.glob sống lâu!
Shadi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.