#r #io
#r #io
Вопрос:
У меня есть текстовый файл, содержащий текстовые данные (я имею в виду, не таблицы или числа, а реальные английские предложения). Через каждые пару предложений есть тройная звездочка (***), чтобы отделить предыдущее предложение от следующего. Мне нужна каждая группа как элемент списка. Я пробовал readLines
, readchar
и strsplit
, но не могу заставить это работать. Вот пример:
Hello Everyone.
My name is James.
***
Hello James!
My name is Amy.
Nice to meet you.
***
Hi Amy!
My name is Sue.
Итак, мне нужен список из трех элементов, каждый из которых является вектором, содержащим группу. Обратите внимание, что в предложениях группы есть символы новой строки.
Комментарии:
1. У вас всегда есть формат
line1, line2, empty_line, triple_asterisk_line
? Или количество текстовых строк является переменной величиной?2. @MauritsEvers Это переменная. Может быть, а может и не быть пустой строки. Их может быть два. Что здесь важно, так это разделить текст тройными звездочками.
Ответ №1:
Предположим, data.txt
что он содержит ваши текстовые записи. Это то, что вы хотите (в базовом R):
data <- readLines("data.txt");
#Optionally remove empty lines
data <- data[data != ""];
# Split based on triple asterisk entries
lst <- split(data, cumsum(data == "***"));
# Remove triple asterisk entries
lst <- lapply(lst, function(x) x[x != "***"])
print(lst);
$`0`
[1] "Hello Everyone." "My name is James."
$`1`
[1] "Hello James!" "My name is Amy."
$`2`
[1] "Hi Amy!" "My name is Sue."
Ответ №2:
Попробуйте это. Если ваш текст находится в файле, то замените textConnection(Lines)
на что-то вроде "myfile.txt"
.
Lines <- "Hello Everyone.
My name is James.
***
Hello James!
My name is Amy.
Nice to meet you.
***
Hi Amy!
My name is Sue."
# L <- paste(readLines("myfile.txt"), collapse = "n")
L <- paste(readLines(textConnection(Lines)), collapse = "n")
v <- strsplit(L, "nn***nn", fixed = TRUE)[[1]]
предоставление следующего символьного вектора длиной 3:
> v
[1] "Hello Everyone.nMy name is James."
[2] "Hello James!nMy name is Amy.nNice to meet you."
[3] "Hi Amy!nMy name is Sue."
Если вместо символьного вектора вам нужен список символьных векторов из отдельных строк, то примените strsplit
еще раз:
strsplit(v, "n")
или, если вы просто хотите принудительно v
перейти к списку:
as.list(v)
Комментарии:
1. Отлично! Единственное, что мне нужно, это чтобы каждая группа была элементом списка. В приведенном выше примере мне нужен список длиной 3, а не вектор. Тогда каждый элемент будет содержать одну группу предложений.
2. Кстати, естественно ли, что R прерывается, если я распечатываю это?
3. Добавлен дополнительный strsplit для разбиения его на строки. Я не совсем понимаю, что означает вопрос в последнем комментарии.
4. Это должен быть список каждого сегмента между звездочками, а не отдельных строк. То есть, точно так же, как v, как вы напечатали его выше, но вместо этого в виде списка. Каждый элемент списка представляет собой целую группу (которая может содержать несколько строк), а не отдельные строки.
5. Смотрите добавленную информацию в конце ответа.