Как удалить элементы до или после пробела в R-векторе - PullRequest
0 голосов
/ 16 января 2020

У меня есть около 200 .txt файлов с текстами песен, которые имеют формат, подобный этому

Useless info
useless info


First Verse
First Verse

Second Verse
Second Verse


useless info

, и я хотел бы прочитать все из них в R, чтобы провести некоторый анализ текста. Моя мысль - прочитать их с readLines, а затем удалить элементы из этого вектора перед первой и последней пустыми строками. Это то, что я имею до сих пор.

lines <- readLines(txtfile)
lines

> "Useless info" "useless info" "" "" "First Verse" "First Verse" 
> "" "" "Second Verse" "Second Verse" "" "" "useless info"

Если бы я жестко запрограммировал решение, я бы просто имел элементы lines[5:6,8:9] и присвоил бы его новой переменной, но поскольку в тексте песни иногда есть два Стихи, а иногда и три, я надеялся, что найдется решение, которое уберет элементы до первого двойного "" и после последнего двойного ""

Если я ошибаюсь, и у кого-то есть идея получше Я более чем счастлив услышать это!

ОБНОВЛЕНИЕ: строки «Бесполезная информация» буквально не говорят «Бесполезная информация», это пути к файлам с текстами и тегами, так что для аналитики причины, они бесполезны для меня

Ответы [ 3 ]

1 голос
/ 16 января 2020

В базе R:

sapply(strsplit(paste(lines, collapse = "&esc;"), "(&esc;){2,3}"), 
       function(x) paste0(gsub("&esc;", "\n", x[-c(1, length(x))]), collapse = "\n\n"))
# [1] "First Verse\nFirst Verse\n\nSecond Verse\nSecond Verse"

Что при печати или записи в текстовый файл дает

First Verse
First Verse

Second Verse
Second Verse
1 голос
/ 17 января 2020

Лучшее решение может зависеть от того, как будет выглядеть ваша дальнейшая обработка, например, хотите ли вы хранить информацию о стихах (@ akrun's rleid здесь будет полезно), свернуть все в одну строку и т. Д. c .. На основе макета файла вы можете удалить первые непустые элементы и последний элемент, а затем все пустые элементы между ними:

# optional: read file _textfile_ with `data.table::fread`
lines <- data.table::fread(text="textfile", header=FALSE, sep=NULL, colClasses='character')$V1

first.empty <- which(!nzchar(lines))[1] # determine where to start

lines <- lines[first.empty:(length(lines)-1)] # also remove last element
lines <- lines[nzchar(lines)] # remove empty elements
lines
# or with `magrittr` pipe:
lines[first.empty:(length(lines)-1)] %>% .[nzchar(.)]
1 голос
/ 16 января 2020

Мы можем создать переменную группировки с rleid

library(data.table)
lst1 <- split(lines, rleid(nzchar(lines)))
lst2 <- lst1[-c(1, length(lst1))]
out  <- unlist(lst2[sapply(lst2, function(x) all(nzchar(x)))], use.names = FALSE)
out
#[1] "First Verse"  "First Verse"  "Second Verse" "Second Verse"

data

lines <- c("Useless info", "useless info", "", "", "First Verse", "First Verse", 
"", "", "Second Verse", "Second Verse", "", "", "useless info"
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...