Belirli bir uzantıya sahip tüm dosyaları listelemek için R kullanma


137

R konusunda çok yeniyim ve ArcGIS kullanılarak oluşturulan bir dizi .dbf tablosunu yinelemek ve bir dizi grafik üretmek için bir R komut dosyasını güncellemek için çalışıyorum.

Tüm .dbf dosyalarımı içeren bir C: \ Scratch dizinim var. Ancak ArcGIS bu tabloları oluşturduğunda bir .dbf.xml dosyası da içerir. Bu .dbf.xml dosyalarını dosya listemden ve dolayısıyla yinelememden kaldırmak istiyorum. Normal ifadeleri aramayı ve denemeyi boşuna denedim. Bu, kullandığım temel ifadedir (çeşitli deneylerin tümü hariç):

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

Biri bana yön verebilir mi?


1
Normal ifadelerle mücadele ediyorsanız ancak joker karakter kalıbını biliyorsanız, işlev glob2rx()genellikle yararlıdır.
caracal

Sadece ben mi yoksa başlık yanıltıcı mı: "yalnızca belirli bir uzantı ile" okumalı mı (ancak SO'da da bazı uzantıları hariç tutmak için bir yanıt bulamıyorum)
J. Win.

caracal, öneri için teşekkürler. jonw, sanırım daha kısa ve öz bir şekilde ifade edebilirdim, sadece toplantıdan önce yayınlanmasını sağlamaya çalışıyordum.
chawkins

dikkatimi çekti çünkü regexp hakkında bilgi edinirken, dışlamanın kolay bir yolu olup olmadığını merak ediyordum. belki ayrı bir soruyu hak ediyor.
J. Win.

Yanıtlar:


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

$sonunda bunun dizginin sonu olduğu anlamına gelir. "dbf$"de işe yarayacaktır, ancak eklemek \\.( .normal ifadelerde özel bir karakterdir, bu nedenle ondan kaçmanız gerekir) yalnızca uzantılı dosyaları eşleştirmenizi sağlar .dbf(örneğin .adbfdosyalarınız olması durumunda ).


1
Bu büyük / küçük harfe duyarlı mı?
nsn

6
@nsn Evet, ancak aksini isterseniz ignore.case, o zaman fonksiyonun argümanı vardır , yani list.files(pattern = "\\.dbf$", ignore.case=TRUE). ?list.filesDaha fazla ayrıntı için bu işlevin ( ) yardım sayfasına bakın.
Marek

61

Normal ifadeler yerine glob kullanan bunu deneyin, böylece yalnızca ile biten dosya adlarını seçecektir. .dbf

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

12

Aşağıdaki karakteri "\\.dbf"kullanarak dizenin sonunda bulunacak deseni pimleyin $:

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

1
Nokta, dosya uzantısında nokta anlamına geliyorsa çalışmaz. Normal ifadede nokta, tek karakterle eşleşir.
Marek

@Marek bunu da fark etti. Kafein rezervlerim bir eşiğin altına düşmüş olmalı.
Gavin Simpson

Hmm bunu \` escape the şimdi eklemeliydi. Öyleyse, bunun neden reddedildiğini merak ediyor musunuz?
Gavin Simpson

8

Sofistike normal ifadeleri kullanmakta pek iyi değilim, bu yüzden böyle bir görevi şu şekilde yaparım:

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

İlk satır, çalışma dizinindeki tüm dosyaları listeler. İkincisi, ".xml" içeren her şeyi bırakır (grep, bu tür dizelerin dizinlerini 'dosyalar' vektöründe döndürür; negatif endekslerle alt kümeleme, karşılık gelen girdileri vektörden kaldırır). grep işlevi için "sabit" argüman sadece benim kaprisimdir, çünkü genellikle Perl-tarzı süslü regexpr'ler olmadan ham kalıp eşleştirmesini yapmasını isterim, bu da beni şaşırtabilir.

Böyle bir çözümün eğitimimdeki dezavantajları yansıttığının farkındayım, ancak bir acemi için faydalı olabilir =) en azından kolay.


1
Daha -önce işareti kaldırmalısınız grep. Bir zip dosyasından belirli dosyaları çıkarmak için bu tür bir çözüme ihtiyacım vardı. Öncelikle, data.frame'deki dosya listesini alın ve belirli dosyaları alın ve daha sonra çıkarın. lf <- unzip(file, list=T)[,1]; files.shp <- lf[grep(".shp", lf, fixed=T)]
Sezen

5

Size tam yol içeren dosyaların listesini verir:

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

çok yaşa sys.glob!
shadi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.