Список всех файлов, соответствующих шаблону полного пути в R
Я пытаюсь получить список файлов, соответствующих шаблону полного пути . До сих пор я использовал list.files (), но это не сработало.
Предположим, что у нас есть следующая организация каталогов:
results |- A | |- data-1.csv | |- data-2.csv | |- B |- data-1.csv |- data-2.csv
Затем выполните команду:
- как получить доменное имя из URL-адреса
- Могу ли я улучшить производительность этого регулярного выражения дальше
- Найти повторяющиеся фразы - любой инструмент или регулярное выражение
- Является ли это RegEx для сопоставления любой ссылки на ячейку в формуле Excel?
- Как использовать регулярное выражение в SQLite-запросе?
list.files(pattern='data-.*\\.csv', recursive=TRUE)
вернет все файлы, соответствующие шаблону. Это работает, но проблема возникает при использовании шаблона полного пути . Например, если я хочу получить все CSV-файлы из результатов каталога / A , я мог бы сделать:
list.files(pattern='results/A/data-.*\\.csv', recursive=TRUE)
Это не работает. Так или иначе, похоже, что R не может использовать шаблон полного пути в качестве регулярного выражения. В этом случае решением может быть просто использовать результаты / A в качестве базового пути. Но в более сложных проблемах это невозможно. Например, в какой-то момент мы можем захотеть сопоставить подкаталоги, содержащие только символы:
list.files(pattern='results/[AZ]+/data-.*\\.csv', recursive=TRUE)
Можно ли это сделать в R?
ОБНОВЛЕНИЕ: после использования ad hoc-решений некоторое время я решил прекратить печатать снова и снова. Итак, я создал библиотеку для упрощения этой задачи.
- Удалить все не «словарные символы» из String в Java, оставив акцентированные символы?
- Заменить несколько букв акцентами с помощью gsub
- Java-Извлечение части строки между двумя специальными символами
- Электронная почта Java regex
- Как извлечь текст из строки с помощью sed?
- Инвертировать совпадение с регулярным выражением
- Regex соответствует только запятым не в круглых скобках?
- Java String.split () Regex
Во-первых, обратите внимание, что вы не используете шаблоны регулярных выражений. Ваш первый пример должен быть:
list.files(pattern='data-.*\\.csv', recursive=TRUE)
Затем кажется, что шаблон, сопоставляемый внутри list.files
, применяется к list.files
файлов (т. list.files
Не включая путь к каталогу), поэтому вы можете разбить задачу на:
-
Найти все файлы, соответствующие только basename, вернуть их полный путь:
basename.matches <- list.files(pattern='data-.*\\.csv', recursive=TRUE, full.names = TRUE) basename.matches # [1] "./results/A/data-1.csv" "./results/A/data-2.csv" "./results/B/data-1.csv" # [4] "./results/B/data-2.csv"
-
Храните только те, которые соответствуют ожидаемой директории (-ий):
full.matches <- grep(pattern='^\\./results/A/', basename.matches, value = TRUE) full.matches # [1] "./results/A/data-1.csv" "./results/A/data-2.csv"
Вы не можете сделать это только с помощью list.files
потому что он перебирает каждый элемент в path
и применяет регулярное выражение к содержащимся в нем файлам. Но поскольку аргумент path
для list.files
может принимать вектор, вы можете использовать его для решения своей проблемы.
dirs <- grep("[AZ]+$",list.dirs("results",recursive=FALSE),value=TRUE) list.files(dirs, "data-.*\\.csv", recursive=TRUE, full.names=TRUE)
Я думаю, что есть еще более простое решение:
Sys.glob(file.path(results, "[AZ]", "data-*.csv"))
я буду использовать
paths <- list.files(results, pattern= glob2rx("*data-*.csv$*"), full.names=T, recursive=T)