Несколько найти и заменить из текстового файла - PullRequest
1 голос
/ 06 октября 2019

У меня есть текстовый файл, который нужно преобразовать в фрейм данных. Текст грязный и требует очистки, удалив пару повторяющихся предложений, заменив новую строку (подстановочный знак в слове «^ p» на табуляцию или запятую и ...

например, мой текстовый файл похож на:

-The data 1 is taken on Aug, 2009 at UBC
and is significant with p value <0.01

-The data 2 is taken on Sep, 2012 at SFU
and is  not significant with p value > 0.06

Как я могу сделать несколько найти и заменить. Я использовал этот код:

tx = readLines("My_text.txt")
tx2 = gsub(pattern = "is taken on", replace = " ", x = tx)
tx3 = gsub(pattern = "at", replace = " ", x = tx2)
writeLines(tx3, con="tx3.txt")

Но я не знаю, как я могу заменить «в» на вкладку (^ t) или как я могу заменить (^ p) на, или, например, пробел ^ p (^ p) на,

Ответы [ 2 ]

2 голосов
/ 06 октября 2019

Используйте регулярные выражения , чтобы учесть границы слов \\b.

Чтобы избежать многократного gsub(), мы могли бы использовать матрицу замены rmx.

rmx <- matrix(c("\\sis taken on\\s\\b", " ",  
                "\\b\\sat\\s", "\t"          #  replace with tab
                ), 2)        
#      [         ,1]                   [,2]         
# [1,] "\\sis taken on\\s\\b" "\\b\\sat\\s"
# [2,] " "                    "\t"   

Теперь мы можем кормить gsub() столбцом rmx столбец, используя apply(). Для внесения постоянных изменений в tx мы можем использовать оператор <<-. Чтобы избежать спама в консоли, мы могли бы обернуть все это с помощью invisible().

tx <- readLines("My_text.txt")
invisible(
  apply(rmx, MARGIN=2, function(x) tx <<- gsub(x[1], x[2], tx))
  )

Чтобы получить непрерывный текст, а не абзацы (что, я полагаю, вы подразумеваете под ^p -заменой), мы могли бы простоpaste() результат, collapse ing ,. Пустые строки должны быть отфильтрованы с помощью tx != "".

tx <- paste(tx[tx != ""], collapse=", ")

Сейчас writeLines().

writeLines(tx, con="tx4.txt")

Результат

-Данные 1 августа 2009 г. UBC и значимы при значении р <0,01; -Данные 2 сентября 2012 г. СФЕ и не значимы при значении р> 0,06

Приложение

Мы также можем заменить специальные символы в R двойным экранированием - прочитайте этот пост .

gsub("\\$", "\t", "today$is$monday")
# [1] "today\tis\tmonday"
1 голос
/ 06 октября 2019

Используя регулярное выражение, предоставленное jay.sf, вы можете использовать str_replace_all из пакета stringr, чтобы сделать это с именованным вектором.

library(stringr)

new_tx <- str_replace_all(tx,
                          c("\\sis taken on\\s" = " ",
                            "\\b\\sat\\s" = "\t",
                            "\\b\\sp\\b" = ","))

cat(new_tx)

Результат

-The data 1 Aug, 2009    UBC
and is significant with, value <0.01

-The data 2 Sep, 2012    SFU
and is  not significant with, value > 0.06
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...