2017-01-18 3 views
2

У меня есть несколько аудиофайлов, которые хранятся в нескольких подпапках в моем рабочем каталоге. У меня есть цикл, который читается в первую минуту каждого файла, а затем сохраняет их как новый файл.Именование файлов в петле R

library(tuneR) 

dir.create("New files") 

FILES<-list.files(PATH, pattern = "audio", recursive = TRUE) 

for(i in 1:length(FILES)){ 
    OneMIN <- readWave(FILES[i], from = 0, to = 60, units = "seconds") 
    writeWave(OneMIN, filename = (file=paste0(FILES[i], "_1-min.wav"))) 
} 

Теперь у вас есть пара ошибок;

1) Новые файлы называются, например. «File1.wav_1-min.wav», так что мне нужно переименовать их в «File_1-min.wav»

2) Новые файлы находятся в нескольких подпапках, и я должен затем скопировать их в «Новый файлы ", используя дополнительные шаги вне цикла.

У меня есть обходные пути для решения этих проблем, но я уверен, что есть более элегантный способ сделать это, включив дополнительные строки в цикле. Я хотел бы:

1) вычистить первый «.wav» в имени файла

2) Автоматическое сохранение их в „Новые файлы“

Однако, у меня нет идея о том, как это сделать. Любые предложения приветствуются. Благодарю.

+2

'fillesOut <- sub (" \\. Wav $ "," ", FILES)' должен работать для первой части. 'paste0 (" ./ NewFiles/", filesOut [i]," _1-min.wav ")' должен получить второй. Также см. 'Dir.create' для создания каталогов в R, но если это одноразовый, вы можете просто сделать это вручную. Также существует 'существует' для проверки существования объекта. – lmo

+0

@lmo, первая часть работает красиво, но для второго я получаю сообщение об ошибке; 'Ошибка в файле (имя файла,« wb »): не удается открыть соединение Кроме того: Предупреждающее сообщение: В файле (имя файла,« wb »): не может открыть файл './Newfiles/2017-01-05/File1_1 min.wav ': Нет такого файла или каталога' – EcologyTom

+0

Взгляните на последнюю часть моего комментария. См. '? Dir.create'. – lmo

ответ

3

file.path() функция может быть использована для комбинированных каталогов и имен файлов в один FilePath, в то время как функция sub() позволит вам легко изменять имена файлов:

library(tuneR) 

dir.create("New files") 

FILES <- list.files(PATH, pattern = "audio", recursive = TRUE) 

for(infile in FILES){ 
    OneMIN <- readWave(infile, from = 0, to = 60, units = "seconds") 
    outfile <- file.path("New files", sub('.wav', '_1-min.wav', infile)) 
    writeWave(OneMIN, filename=outfile) 
} 

Кроме того, стоит отметить, что в исходном коде sample, функция list.files() возвращает только часть имени файла для каждого пути к файлу.

Таким образом, вы, возможно, потребуется изменить код, чтобы выглядеть примерно так:

FILES <- list.files(PATH, pattern = "audio", recursive = TRUE, full.names=TRUE) 

и:

outfile <- file.path("New files", sub('.wav', '_1-min.wav', basename(infile))) 

Это гарантирует, что оба infile и outfile указывают на правильное расположение.

1

Думал, что я опубликую свое решение, которое будет заимствовано из ответа @Keith Hughitt и комментариев @lmo. Спасибо им обоим за помощь в разработке того, что мне нужно.

for(i in 1:length(FILES)){ 
OneMIN <- readWave(FILES[i], from = 0, to = 60, units = "seconds") 
FILE.OUT <- sub("\\.wav$", "_1 min.wav", FILES) 
OUT.PATH <- file.path("New files", basename(FILE.OUT)) 
writeWave(OneMIN, filename = OUT.PATH[i]) 
} 

Как подразумевалось, я получал ошибки из-за проблем с путями. Мне не нужно full.names = TRUE в назначении FILES, но мне нужно было включить basename() в цикл.

Как показал Кейт в своем ответе, линия FILE.OUT не является абсолютно необходимой, но она помогает мне отслеживать различные этапы.