Переименование файлов с помощью библиотеки r («tidyverse»)

Я пытаюсь переименовать кучу файлов в r с помощью библиотеки («tidyverse»).

Как есть: Snap-551-Image Export-01_c1_ORG.tif

Жирный раздел представляет собой порядковый номер, начиная с 01 и заканчивая 150, каждое число сочетается с _c1 и _c2.

БУДЕТ: 001_551_c1_AE2315_01.tif

Первые 20 файлов взяты из одного и того же образца. Следовательно, их имена должны иметь один и тот же номер образца, здесь 001, выделенный жирным шрифтом. Исходный номер должен использоваться в конце нового имени файла.

Буду очень признателен за любую помощь в этом вопросе :-) Большое спасибо, Энди.

Я не понимаю, зачем вам для этого нужен tidyverse. Я бы использовал list.files, gsub и file.rename. Единственная немного сложная часть — создание правильного регулярного выражения.

Roland 18.06.2024 15:14

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

margusl 18.06.2024 15:46

Значит, 001 относится к первым 20 файлам, а следующие 20 должны иметь 002? Если нет, то откуда еще следует взять номер выборки?

Andre Wildberg 18.06.2024 15:54

Изображения не являются хорошим способом публикации данных (или кода). См. эту мета и соответствующий xkcd. Можете ли вы опубликовать примеры данных в формате dput? Пожалуйста, отредактируйте вопрос, указав код, который вы пробовали, и вывод dput(<filenames table>). Или, если он слишком велик с выходом dput(head(<filenames table>, 20)).

Rui Barradas 18.06.2024 18:13

Два дня назад у меня были похожие проблемы, и я использовал file.rename плюс шаблон, как вам уже кто-то сказал. tidyverse не подходит для вашей проблемы.

Alejandro Carrera 18.06.2024 23:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
100
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Возможно, вам подойдет этот простой пример:

# text files in current working directory
A.txt, B.txt, C.txt

# get all files with the unique extension in your cwd
files <- list.files(pattern = "*.txt")

# rename the files by passing a vector of the new file names to the file.rename() function in the order of files in your cwd
file.rename(from = files,
            to = c("Apt.txt","Bart.txt","Dart.txt"))

# renamed files in cwd
Apt.txt, Bart.txt, Dart.txt

Однако это очень простой пример того, как переименовывать файлы в cwd, но я надеюсь, что он укажет вам правильное направление.

Это ответ ChatGPT? Это действительно так кажется. И это не решает вопрос: где находится регулярное выражение?

Rui Barradas 18.06.2024 18:12

Это НЕ ответ, созданный ChatGPT. Людям следует перестать полагать, что каждый хорошо сформулированный ответ, опубликованный на SO, должен быть сгенерирован ИИ. Люди умны и тоже умеют не торопиться! Кроме того, я считаю, что схема выбора документов ясна из ответа выше.

Ifeanyi Idiaye 18.06.2024 18:28
Ответ принят как подходящий

При этом используются регулярные выражения (регулярные выражения) для создания вектора новых имен на основе исходных имен ваших файлов .tif, а затем используется этот вектор для переименования ваших файлов. Как утверждали другие, этого можно достичь с помощью базы R, но если вам нужно решение tidyverse, вот как это сделать с помощью пакетов dplyr и stringr.

Если вы исключите функцию select(), вы сможете увидеть отдельные шаги, использованные для создания имен файлов, например. столбцы id_num. Три регулярных выражения можно было бы выполнить в одном, но мои навыки не простираются так далеко. Кроме того, использование трех разных шагов, возможно, облегчит выполнение, если вы не знакомы с регулярным выражением.

Он все равно будет работать, даже если у вас есть несколько серийных номеров, например. 551, 552 и т. д.

library(dplyr)
library(stringr)

# Set working directory to where tif files are stored (change to suit)
setwd("C:/folder/where/tif/files/stored")

# Create dataframe with vector of tif file names
file_list <- data.frame(old_name = list.files(pattern = "^Snap.*\\.tif$"))

# Create column with vector of new names (based on your example)
file_list <- file_list |>
  mutate(
    id_num1 = str_extract(old_name, "(?<=Snap-)[0-9]+"),
    id_num2 = str_extract(old_name, "(?<=Image Export-)[0-9]+"),
    id_num3 = str_extract(old_name, "(?<=_c)[0-9]+"),
    new_name = sprintf("%03d_%s_c%s_AE2315_%02d.tif",
                       as.integer(id_num2),
                       id_num1,
                       id_num3,
                       as.integer(id_num2))) |>
  select(old_name, new_name)

# Rename file_list
file.rename(file_list$old_name, file_list$new_name)

Другие вопросы по теме