Модификация LexisNexisTools в R (RStudio) для переименования файлов - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь переименовать файлы .txt в каталог, загруженный с Nexis Advance UK. Будучи незнакомым с кодированием, я попытался изменить код LexisNexisTools * в RStudio.

Что я сделал, например, изменил term.v <- content_v[grep("^Terms: |^Begriffe: ", content_v)] на term.v <- content_v[grep("The Guardian(London)", fixed = T, content_v)] и изменил функцию переименования, чтобы она вставляла только term.v. Однако я пытаюсь сохранить исходную функцию OR, чтобы код циклически проходил через несколько строк, например "Express Online" или "The Independent (United Kingdom)", а затем вставлял найденную строку в файл. переименовать функцию.

Вот то, что я пробовал до сих пор:

1 - использовать регулярные выражения (из того, что я мог собрать в Интернете по регулярным выражениям с пробелами в строках) с fixed = F, например "^The/sGuardian(London)$|^Express/sOnline$"

2- Я попытался использовать вектор для «размещения» различных шаблонов, а затем вставить вектор в команду grep

toMatch.v <- c("Express Online", "The Times (London)", "The Independent (United Kingdom)" 

term.v<- content_v[grep(paste(toMatch, collapse="|"),  content_v)]

Единственный раз, когда код (как измененный) ) работает, когда fixed = T и строка набирается так, как это найдено в файлах .txt.

Что я делаю не так? Большое спасибо, и я прошу прощения, если терминология не точна.

Дополнительные сведения:

Первоначально код опирается на набор ключевых слов для поиска поискового запроса и вставки его в имя файла:

    content_v <- readLines(files[i], encoding = encoding, n = 50)
    term.v <- content_v[grep("^Terms: |^Begriffe: ", content_v)]
    # erase everything in the line exept the actual range
    term.v <- gsub("^Terms: |^Begriffe: ", "", term.v)
    # split term into elemets seprated by and or OR
    term.v <- unlist(strsplit(term.v, split = " AND | and | OR ", fixed = FALSE))

Я изменился это так, что grep начинается со строки, которую я хочу добавить к имени файла, как объяснено выше. Я также отключил строку gsub и изменил аргумент split на "/n", поскольку строка в моих текстовых файлах отделяется разрывом строки. Вот пример примера файла .txt.

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

К сожалению, ваш формат файла сильно отличается от того, как выглядели файлы, когда я писал LexisNexisTools. Как и ваши требования. Поэтому я бы написал новый код, чтобы сделать работу здесь. Во-первых, давайте попробуем для одного файла:

f <- "/home/johannes/Documents/x.txt"
lines <- readLines(f)

toMatch.v <- c("Express Online", "The Times (London)", "The Independent (United Kingdom)")

# I'm using another function from the package to convenietly look up a several patterns at once
np <- unlist(LexisNexisTools::lnt_lookup(lines, toMatch.v, verbose = FALSE))[1]
new_name <- paste0(dirname(f), "/", np, ".txt")
new_name
#> [1] "/home/johannes/Documents/Express Online.txt"

file.rename(f, new_name)

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

files <- list.files("/home/johannes/Documents/", pattern = ".txt$", 
                    ignore.case = TRUE, full.names = TRUE)

make_new_name <- function(old_name) {
  lines <- readLines(old_name)

  np <- unlist(LexisNexisTools::lnt_lookup(lines, toMatch.v, verbose = FALSE))[1]
  paste0(dirname(old_name), "/", np, ".txt")
}  

df <- tibble::tibble(
  old = files,
  new = sapply(files, make_new_name)
)
df               
#> # A tibble: 2 x 2
#>   old                              new                                        
#>   <chr>                            <chr>                                      
#> 1 /home/johannes/Documents//x.txt  /home/johannes/Documents/Express Online.txt
#> 2 /home/johannes/Documents//x2.txt /home/johannes/Documents/Express Online.txt

Если новые имена имеют смысл для вас и если нет дубликатов (table(duplicated(df$new))), вы можете нажать на триггер и переименовать файлы:

file.rename(df$old, df$new)
0 голосов
/ 23 апреля 2020

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

foo
foo bar Express Online
bar

Затем следующий код должен переименовать файл в Express Online.txt.

file1 <- "file1.txt"

text1 <- readLines(file(file1))

# if (any(grepl("The Guardian", text1))) {
#     file.rename(file1, "The Guardian.txt")
# } else if (any(grepl("Express Online", text1))) {
#     file.rename(file1, "Express Online.txt")
# }

newname <- head(
    n = 1,
    na.omit(
        stringr::str_extract(
            text1,
            "(Express Online)|(The Times \\(London\\))|(The Independent \\(United Kingdom\\))")))

file.rename(file1, paste0(newname, ".txt"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...