Використовуючи R для списку всіх файлів із заданим розширенням


137

Я дуже новачок у R і працюю над оновленням сценарію R, щоб повторити його через ряд таблиць .dbf, створених за допомогою ArcGIS, і створити ряд графіків.

У мене є каталог C: \ Scratch, який буде містити всі мої файли .dbf. Однак, коли ArcGIS створює ці таблиці, він також включає файл .dbf.xml. Я хочу видалити ці .dbf.xml файли зі свого списку файлів і, таким чином, мою ітерацію. Я намагався шукати й експериментувати з регулярними виразами безрезультатно. Це основний вираз, який я використовую (Виключаючи всі різні експерименти):

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

Хтось може дати мені якийсь напрямок?


1
Якщо ви боретеся з регулярними виразами, але знаєте схему підстановки, функція glob2rx()часто корисна.
каракал

Це лише я, або заголовок вводить в оману: слід читати "лише з певним розширенням" (але я не можу знайти відповідь на SO, щоб виключити певні розширення)
J. Win.

каракал, дякую за пропозицію. jonw, я вважаю, що я міг би сказати це більш лаконічно, я просто намагався опублікувати його перед зустріччю.
chawkins

це привернуло мою увагу, тому що, коли я дізнаюся про regexp, мені було цікаво, чи є простий спосіб виключити. можливо заслуговує окремого питання.
Дж. Він.

Відповіді:


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

$в кінці означає, що це кінець рядка. "dbf$"також буде працювати, але додавання \\.( .є спеціальним символом у звичайних виразах, тому вам потрібно уникати цього) гарантуйте відповідність лише файлам із розширенням .dbf(у випадку, якщо у вас є, наприклад, .adbfфайли).


1
Це чутливий регістр?
nsn

6
@nsn Так, але якщо ви хочете інакше, тоді є ignore.caseаргумент функції, так list.files(pattern = "\\.dbf$", ignore.case=TRUE). І подивіться на довідковій сторінці цієї функції ( ?list.files) для отримання більш детальної інформації.
Марек

61

Спробуйте це скористатися глобусами, а не регулярними виразами, щоб вибирати лише імена файлів, які закінчуються .dbf

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

12

Прив’яжіть шаблон, щоб знайти "\\.dbf"в кінці рядка, використовуючи $символ:

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

1
Якщо крапка означає крапку з розширення файлу, вона не працюватиме. Точка збігається з одним символом у регулярному вираженні.
Марек

@Marek теж це помітив. Мої запаси кофеїну, мабуть, опустилися нижче порогового значення.
Гевін Сімпсон

Хм, слід було б додати, що \` escape the . Тож не дивуєшся, чому це зменшилось?
Гевін Сімпсон

8

Я не дуже добре використовую складні регулярні вирази, тому я б робив таке завдання наступним чином:

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

Перший рядок просто перераховує всі файли з робочого режиму. По-друге, випадає все, що містить ".xml" (grep повертає індекси таких рядків у вектор "файлів"; підзадача з негативними індексами видаляє відповідні записи з вектора). "фіксований" аргумент функції grep - це лише моя примха, оскільки я, як правило, хочу, щоб вона перетворила грубу схему зіставлення без стилю Perl стилю.

Я знаю, що таке рішення просто відображає недоліки в моїй освіті, але для новачка це може бути корисним =) принаймні, це легко.


1
Ви повинні видалити -знак раніше grep. Мені потрібно було таке рішення, щоб витягти конкретні файли з zip-файлу. Спочатку знайдіть список файлів у data.frame та отримайте конкретні файли та витягніть їх згодом. lf <- unzip(file, list=T)[,1]; files.shp <- lf[grep(".shp", lf, fixed=T)]
Сезен

5

Надає список файлів з повним шляхом:

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

хай живе sys.glob!
шаді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.