Чтение текстового файла с разделителем из нескольких символов в список в R

#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. Смотрите добавленную информацию в конце ответа.