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?

chawkins
sumber
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 ).

Marek
sumber
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")
G. Grothendieck
sumber
12

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

list.files(pattern = "\\.dbf$")
Gavin Simpson
sumber
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.

donshikin
sumber
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
Surya
sumber
long live sys.glob!
shadi