Использование пакета tidyverse:
library(tidyverse)
text <- list(readLines("https://raw.githubusercontent.com/pranavn91/PhD/master/Expt/sample.txt"))
out <- tibble(text = text)
out <- out %>%
rowwise() %>%
mutate(ids = str_extract(text,"Id: .+") %>% na.omit() %>% str_remove("Id: ") %>% str_c(collapse = ", "),
ASIN = str_extract(text,"ASIN: .+") %>% na.omit() %>% str_remove("ASIN: ") %>% str_c(collapse = ", "),
title = str_extract(text,"title: .+") %>% na.omit() %>% str_remove("title: ") %>% str_c(collapse = ", "),
group = str_extract(text,"group: .+") %>% na.omit() %>% str_remove("group: ") %>% str_c(collapse = ", "),
similar = str_extract(text,"similar: .+") %>% na.omit() %>% str_remove("similar: ") %>% str_c(collapse = ", "),
rating = str_extract(text,"avg rating: .+") %>% na.omit() %>% str_remove("avg rating: ") %>% str_c(collapse = ", ")
) %>%
ungroup()
Я поместил текст в список, потому что я предполагаю, что вы захотите создать фрейм данных с поиском нескольких элементов.Если вы просто добавляете новый элемент списка для каждой строки readLines, которую вы делаете.
Обратите внимание, что mutate рассматривает каждый элемент в списке как объект, который эквивалентен использованию текста [[1]] ...
Если у вас есть, и элемент встречается несколько раз, вы 'Вам нужно будет добавить %>% str_c(collapse = ", ")
, как я сделал, в противном случае вы можете удалить его.
ОБНОВЛЕНИЕ на основе новых образцов данных:
Новый образец набора данных создает некоторые различные проблемы, которые не были рассмотрены в моем первоначальном ответе.
Во-первых, все данные находятся в одном файле, и я предполагал, что они будут в нескольких файлах.Можно либо разделить все в список списков, либо разделить все на вектор символов.Я выбрал второй вариант.
Поскольку я выбрал второй вариант, теперь мне нужно обновить свой код для извлечения данных, пока не будет достигнута \ r (необходимо \\ r в R из-за того, как R обрабатывает экранирование).
Далее некоторые поля пусты!Нужно добавить проверку, чтобы увидеть, если результат пуст, и исправить вывод, если он есть.Для этого я использую %>% ifelse(length(.)==0,NA,.)
.
Примечание: если вы добавите другие поля, например категории: для этого поиска код будет захватывать только первую строку текста.Это нужно будет изменить, чтобы захватить более одной строки.
library(tidyverse)
# Read text into a single long file.
text <- read_file("https://raw.githubusercontent.com/pranavn91/PhD/master/Expt/sample.txt")
# Separate each Id: into a character string in a vector
# Use negative lookahead to capture groups that don't have Id: in them.
# Use an or to also capture any non-words that don't have Id: in them.
text <- str_extract_all(text,"Id: (((?!Id:).)|[^(Id:)])+") %>%
flatten()
out <- tibble(text = text)
out <- out %>%
rowwise() %>%
mutate(ids = str_extract(text,"Id: ((?!\\\\r).)+") %>% na.omit() %>% str_remove("Id: ") %>% str_c(collapse = ", ") %>% ifelse(length(.)==0,NA,.),
ASIN = str_extract(text,"ASIN: ((?!\\\\r).)+") %>% na.omit() %>% str_remove("ASIN: ") %>% str_c(collapse = ", ") %>% ifelse(length(.)==0,NA,.),
title = str_extract(text,"title: ((?!\\\\r).)+") %>% na.omit() %>% str_remove("title: ") %>% str_c(collapse = ", ") %>% ifelse(length(.)==0,NA,.),
group = str_extract(text,"group: ((?!\\\\r).)+") %>% na.omit() %>% str_remove("group: ") %>% str_c(collapse = ", ") %>% ifelse(length(.)==0,NA,.),
similar = str_extract(text,"similar: ((?!\\\\r).)+") %>% na.omit() %>% str_remove("similar: \\d") %>% str_c(collapse = ", ") %>% ifelse(length(.)==0,NA,.),
rating = str_extract(text,"avg rating: ((?!\\\\r).)+") %>% na.omit() %>% str_remove("avg rating: ") %>% str_c(collapse = ", ") %>% ifelse(length(.)==0,NA,.)
) %>%
ungroup()