R: Изменить текст во всех файлах в папке - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь изменить , (запятая) на . (точка) во всех моих текстовых файлах, которые находятся в указанной папке c, используя R. Однако Я не хочу вручную указывать путь к файлу каждый раз. Вместо этого я хочу l oop поверх всех файлов .TXT в папке и внести изменения в них, а затем просто сохранить их снова с тем же именем в том же месте.

На данный момент У меня проблемы с функцией writeLines, когда я пытался установить путь с помощью изменяемой переменной, это, похоже, не работает, что приводит к сообщению об ошибке:

"Ошибка в writeLines (tx2, path = listFiles [i ]): неиспользуемый аргумент (path = listFiles [i]) "

Это мой черновой код проекта:

folder_path <- "C:/Users/pathToMyFiles"
setwd(folder_path)
listFiles= list.files(path = "C:/Users/pathToMyFiles", pattern= "*.TXT",
           full.names = TRUE)

#print(listFiles)
#print(listFiles[1])

i=1
for (i in length(listFiles)) {
  tx  <- readLines(listFiles[i])
  tx2  <- gsub(pattern = ",", replace = ".", x = tx)
  writeLines(tx2, path = listFiles[i])
  i <- i + 1
}

При просмотре полученного вывода все шаги в коде кажутся работать, кроме функции "writeLines".

Буду признателен, если кто-нибудь найдет способ обойти это.

Всего наилучшего!

N

1 Ответ

1 голос
/ 02 апреля 2020

Очистка вашего решения для работы:

setwd('C:/Users/pathToMyFiles')

text_file_list <- list.files(pattern='*.txt')
for (text_file in text_file_list) {
  text_from_file <- readLines((text_file))
  modified_text <- gsub(',', '.', text_from_file)
  writeLines(modified_text, text_file)
}

И еще oop бесплатное решение с использованием pipe (без смены каталога на этот раз):

library(magrittr)

{text_file_list <- list.files(path='C:/Users/pathToMyFiles',
                              pattern='*.txt',
                              full.names=TRUE)} %>%
  lapply(readLines) %>%
  lapply(function(x) gsub(',', '.', x)) %>%
  {mapply(function(x, y) writeLines(x, y), ., text_file_list)}

Некоторые комментарии к вашему коду :

  1. После setwd() вам не нужны аргументы path и full.names в list.files(). Кстати, хорошей практикой является не изменять каталоги из кода, чем, конечно, вы должны использовать эти аргументы (как указал @ r2evans).
  2. Вам не нужны i = 1 и i <- i + 1 для for l oop
  3. И там, где у вас была ошибка: вы должны использовать i in 1:length(fileList). То, как вы его использовали, изменило только последний файл в списке.
  4. Все остальные изменения - только косметика
...