Как написать функцию R, которая читает в каталоге текстовых файлов, изменяет их и сохраняет в тот же каталог - PullRequest
0 голосов
/ 24 марта 2020

Пытался найти ответ в другом месте, но безуспешно, поэтому вот так:

У меня есть каталог, полный .txt файлов, содержащих естественный язык (законодательство). Я хочу прочитать в каталоге, выполнить некоторые операции со строками для каждого файла, используя новую функцию, и сохранить файл в том же каталоге с новым именем файла.

Пример данных (обратите внимание на строку «Информация о начале») в конце):

example <- "(7) A person who is not a UK national commits an offence under this section if 
            — (a) any part of the arranging or facilitating takes place in the United 
            Kingdom, or (b) the travel consists of arrival in or entry into, departure
            from, or travel within, the United Kingdom. Commencement Information I2 S. 2 
            in force at 31.7.2015 by S.I. 2015/1476, reg. 2(a) (with regs. 6-8)"

Я разобрался с чтением в каталоге (с помощью этот ответ), который отлично работает:

files <- list.files(path="../txt_copies/", pattern="*.txt", all.files=T, full.names = T) #filenames
filelist <- lapply(files, read.delim) #read in files from the filenames list
names(filelist) <- paste0(basename(file_path_sans_ext(files))) #name list elements by filenames
list2env(filelist, envir=.GlobalEnv) #move the list elements into the global env as objects

Проблема моя функция:

page_cleaner <- function(x) {

  txt <- x

  # clean text and print confirmation
  txt <- str_replace_all(txt, "(F)(\\d).+?(\\n)", "")
  txt <- gsub("Textual Amendments", "", txt)
  print("Text cleaned of Textual Amendments")
  txt <- str_replace_all(txt, "(Commencement Information).+?(\\d)\\)", "")
  txt <- str_replace_all(txt, "(Commencement Information).+?(\\w)\\)", "")
  print("Text cleaned of Commencement Information")

  x <- txt

}

lapply(names(filelist), page_cleaner)

Должно возвращаться:

[1] "(7) A person who is not a UK national commits an offence under this section if
     — (a) any part of the arranging or facilitating takes place in the United Kingdom, 
     or (b) the travel consists of arrival in or entry into, departure from, or travel 
     within, the United Kingdom.

Кажется, что это нормально работает на примере, когда я вызываю функцию самостоятельно, например page_cleaner(example) но не в списке файлов.

Я был совершенно уверен, что это сработает, и я не могу понять, где я ошибся. Эти манипуляции со строками прекрасно работают вне функции. В данных примера они должны удалить все, начиная с «Начальной информации» и заканчивая концом строки.

У меня уже есть метод для сохранения объектов в каталоге, когда все это сделано, в этом не требуется помощь .

Спасибо!

1 Ответ

0 голосов
/ 24 марта 2020

Назовите список для счастья, а не для имени. Итак, измените эту строку:

lapply(names(filelist), page_cleaner)

до

lapply(filelist, page_cleaner)

Дополнительные предложения:

Вы можете просто использовать stringr::str_remove или stringr::str_remove_all, чтобы удалить строка.

page_cleaner <- function(txt) {

  # clean text and print confirmation
  txt <- txt %>% 
    str_remove_all("(F)(\\d).+?(\\n)") %>%
    str_remove("Textual Amendments")
  print("Text cleaned of Textual Amendments")

  txt <-txt %>% 
    str_remove_all("(Commencement Information).+?(\\d)\\)")
  print("Text cleaned of Commencement Information")

  return(txt)

}
...