Использование R для вывода списка всех файлов с указанным расширением

137

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

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

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

Кто-нибудь может дать мне какое-нибудь направление?

chawkins
источник
1
Если вы боретесь с регулярными выражениями, но знаете шаблон подстановки, функция glob2rx()часто оказывается полезной.
каракал
Это только у меня, или заголовок вводит в заблуждение: следует читать «только с определенным расширением» (но я также не могу найти ответа на SO, чтобы исключить определенные расширения)
Дж. Вин.
каракал, спасибо за предложение. jonw, я полагаю, я мог бы сформулировать это более кратко, я просто пытался опубликовать это перед встречей.
Chawkins
это привлекло мое внимание, потому что, когда я узнал о регулярном выражении, я задавался вопросом, есть ли простой способ исключения. возможно заслуживает отдельного вопроса.
Дж. Вин.

Ответы:

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

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

Marek
источник
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 возвращает индексы таких строк в векторе files; подмножество с отрицательными индексами удаляет соответствующие записи из вектора). «Фиксированный» аргумент для функции grep - это просто моя прихоть, поскольку я обычно хочу, чтобы он выполнял грубое сопоставление с образцом без модных регулярных выражений в стиле Perl, что может вызвать у меня удивление.

Знаю, что такое решение просто отражает недостатки в моем образовании, но для новичка оно может быть полезно =) По крайней мере, это просто.

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

Предоставляет вам список файлов с полным путем:

  Sys.glob(file.path(file_dir, "*.dbf")) ## file_dir = file containing directory
Surya
источник
да здравствует sys.glob!
Шади