Menggunakan R untuk mencantumkan semua file dengan ekstensi yang ditentukan


137

Saya sangat baru untuk R dan saya sedang berusaha memperbarui skrip R untuk beralih melalui serangkaian tabel .dbf yang dibuat menggunakan ArcGIS dan menghasilkan serangkaian grafik.

Saya memiliki direktori, C: \ Scratch, yang akan berisi semua file .dbf saya. Namun, ketika ArcGIS membuat tabel ini, itu juga termasuk file .dbf.xml. Saya ingin menghapus file .dbf.xml ini dari daftar file saya dan dengan demikian iterasi saya. Saya sudah mencoba mencari dan bereksperimen dengan ekspresi reguler tanpa hasil. Ini adalah ungkapan dasar yang saya gunakan (Tidak termasuk semua eksperimen):

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

Adakah yang bisa memberi saya arahan?


1
Jika Anda kesulitan dengan regexps tetapi mengetahui pola-wildcard, fungsinya glob2rx()sering kali membantu.
caracal

Apakah hanya saya atau judulnya menyesatkan: harus membaca "hanya dengan ekstensi tertentu" (tetapi saya tidak dapat menemukan jawaban pada SO untuk mengecualikan ekstensi tertentu juga)
J. Win.

caracal, terima kasih atas sarannya. jonw, saya kira saya bisa mengatakannya dengan lebih ringkas, saya hanya mencoba untuk mempostingnya sebelum rapat.
chawkins

itu menarik perhatian saya karena ketika saya belajar tentang regexp, saya bertanya-tanya apakah ada cara mudah untuk dikecualikan. mungkin layak mendapat pertanyaan terpisah.
J. Win.

Jawaban:


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

$pada akhirnya berarti bahwa ini adalah akhir dari string. "dbf$"akan bekerja juga, tetapi menambahkan \\.( .adalah karakter khusus dalam ekspresi reguler sehingga Anda perlu menghindarinya) memastikan bahwa Anda hanya mencocokkan file dengan ekstensi .dbf(jika Anda memiliki .adbffile misalnya ).


1
Apakah case sensitif?
nsn

6
@nsn Ya, tetapi jika Anda ingin sebaliknya maka ada ignore.caseargumen fungsi, jadi list.files(pattern = "\\.dbf$", ignore.case=TRUE). Dan lihat halaman bantuan untuk fungsi itu ( ?list.files) untuk lebih jelasnya.
Marek

61

Coba ini yang menggunakan gumpalan daripada ekspresi reguler sehingga hanya akan memilih nama file yang berakhiran .dbf

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

12

Pasak pola untuk menemukan "\\.dbf"di akhir string menggunakan $karakter:

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

1
Jika titik berarti titik dari ekstensi file, itu tidak akan berfungsi. Dot mencocokkan karakter tunggal dalam ekspresi reguler.
Marek

@ Mars hanya memperhatikan itu juga. Cadangan kafein saya pasti turun di bawah ambang batas.
Gavin Simpson

Hmm seharusnya sudah menambahkan \` escape the .` sekarang. Jadi orang bertanya-tanya mengapa ini diturunkan?
Gavin Simpson

8

Saya tidak terlalu baik dalam menggunakan ekspresi reguler yang canggih, jadi saya akan melakukan tugas tersebut dengan cara berikut:

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

Baris pertama hanya mencantumkan semua file dari direktori yang berfungsi. Yang kedua menjatuhkan semua yang mengandung ".xml" (grep mengembalikan indeks string seperti itu dalam vektor 'file'; berlangganan dengan indeks negatif menghapus entri yang sesuai dari vektor). Argumen "tetap" untuk fungsi grep hanyalah kemauan saya, karena saya biasanya menginginkannya untuk mencocokkan pola kasar tanpa regexprs mewah bergaya Perl, yang dapat mengejutkan saya.

Saya sadar bahwa solusi seperti itu hanya mencerminkan kekurangan dalam pendidikan saya, tetapi bagi seorang pemula mungkin berguna =) setidaknya itu mudah.


1
Anda harus menghapus -tanda sebelumnya grep. Saya membutuhkan solusi semacam ini untuk mengekstrak file tertentu dari file zip. Pertama, dapatkan daftar file dalam data.frame dan dapatkan file tertentu dan ekstrak nanti. lf <- unzip(file, list=T)[,1]; files.shp <- lf[grep(".shp", lf, fixed=T)]
Sezen

5

Memberi Anda daftar file dengan path lengkap:

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

long live sys.glob!
shadi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.