любезно просмотрите документацию, которая заявляет.
Вы не можете получить это через компоненты, объявленные в манифесте, только путем явной регистрации для него с помощью Context.registerReceiver()
.
Вот почему вы не сможете получить его при выполнении через файл манифеста. спасибо
Решение с использованием stringr
library(data.table)
library(stringr)
library(dplyr)
dataDT <- data.table(data = c("1,10,some text... , some text,,20190801",
"2,22,some text... , some text,,20190801",
"3,30,some text... , some text,,20170601"))
dataDT <- dataDT %>%
mutate(
ColA = str_extract(data, "^[^,]*(?=,)"),
ColB = str_extract(data, "(?<=,)[^,]*(?=,)"),
ColD = str_extract(data, "(?<=,)[^,]*$"),
ColC = str_sub(data, nchar(ColA)+nchar(ColB)+3, nchar(data)-nchar(ColD)-1)
) %>%
select(ColA, ColB, ColC, ColD)
dataDT
#> ColA ColB ColC ColD
#> 1 1 10 some text... , some text, 20190801
#> 2 2 22 some text... , some text, 20190801
#> 3 3 30 some text... , some text, 20170601
Создано в 2019-06-27 с помощью пакета представитель (v0.3.0) sup>
Вот regex
шаблон, который позволит Вам заменять символами запятой, которые смежны с выводом два и терминальные числовые значения и разделяют их друг от друга и сопроводительного текста с пробелами. Могло бы быть более безопасно использовать непробел для разделения, так как мой следующий шаг должен будет считать эти "строки" с одним из read.*
функции или возможно fread
снова. Возможно, с помощью "|" как разделитель?
sub("(\\d+)[,](\\d+)[,](.+)[,](\\d+)$",
"\\1 \\2 '\\3' \\4",
dataDT$"ColA,ColB,ColC,ColD" )
[1] "1 10 'some text... , some text,' 20190801" "2 22 'some text... , some text,' 20190801"
[3] "3 30 'some text... , some text,' 20170601"
круглые скобки в шаблоне используются для создания "классов получения", и в каждом случае я "получил" произвольное число цифр или десятичных разделителей с "\d +" шаблон. Я также окружил текст (полученный с ". +") с одинарными кавычками на шаблоне замены, таким образом, "внутренние пространства" в третьем column-want-to-be не были бы считаны как разделители. "\\1"
, "\\2"
, и т.д., ссылки назад на полученные символы в каждом из классов получения, заказанных в последовательности их появлений в шаблоне. См. ?regex
. Однако одинарные кавычки не были бы необходимы при использовании другого разделителя.
Вот тестовое использование "|" как sep
.
fread(text =sub("(\\d+)[,](\\d+)[,](.+)[,](\\d+)", "\\1|\\2|'\\3'|\\4", dataDT$"ColA,ColB,ColC,ColD" ) ,sep="|")
V1 V2 V3 V4
1: 1 10 'some text... , some text,' 20190801
2: 2 22 'some text... , some text,' 20190801
3: 3 30 'some text... , some text,' 20170601
Примечание: Если Ваши числовые значения имеют запятые или имеют ведущую или запаздывающую валюту, необходимо измениться пример начиная с использования "\\d"
для получения числовых групп символов больше не будет успешно выполняться.
Ответы, опубликованные до сих пор, предлагают решения с использованием регулярных выражений.
В качестве альтернативы, могут быть рассмотрены позиции столбцов. Как указывал ОП
blockquote>
- ColA имеет строку перед 1-й запятой;
- ColB имеет все между 1 и 2 запятой;
- У ColD есть строка после последней запятой;
- ColC имеет строку в средней части (она может содержать дополнительные запятые).
Идея состоит в том, чтобы прочитать файл, используя
fread()
сsep = ","
, как обычно, что приводит к смещению набора данных. После преобразования в длинный формат можно определить первый, второй и последний столбцы, а также промежуточные столбцы на строку . Этим записям можно присвоить имя соответствующего столбца. Во время окончательного преобразования в широкоформатный формат промежуточные столбцы свернуты вColC
.library(data.table) # read file DT <- fread(" 1,10,some text... some text,,20190801 2,22,some text... , some text,,20190801 3,30,some text... ,, some text,,20170601" , sep = "," , fill = TRUE , header = FALSE , strip.white = FALSE)
Обратите внимание, что образец набора данных был изменен путем вставки дополнительной запятой, чтобы иметь более реалистичный контрольный пример.
Результатом операции чтения является выровненный и рваный набор данных:
DT
blockquote>V1 V2 V3 V4 V5 V6 V7 1: 1 10 some text... some text 20190801 NA NA 2: 2 22 some text... some text 20190801 NA 3: 3 30 some text... some text NA 20170601
cols <- c("ColA", "ColB", "ColC", "ColD") # reshape from wide to long format long <- melt(DT[, rn := .I], "rn", na.rm = TRUE) # create lookup table to rename column names lut <- long[, .(variable, col = rep(cols, c(1L, 1L, .N - 3, 1L))), by = rn] # rename columns by an update join long[lut, on = .(rn, variable), variable := col][] # reshape and collapse dcast(long, rn ~ variable, paste, collapse = ",")
blockquote>ColA ColB ColC ColD 1: 1 10 some text... some text, 20190801 2: 2 22 some text... , some text, 20190801 3: 3 30 some text... ,, some text 20170601
Подход можно лучше объяснить, если мы посмотрим на промежуточные результаты.
После
melt()
,long
равноblockquote>rn variable value 1: 1 V1 1 2: 2 V1 2 3: 3 V1 3 4: 1 V2 10 5: 2 V2 22 6: 3 V2 30 7: 1 V3 some text... some text 8: 2 V3 some text... 9: 3 V3 some text... 10: 1 V4 11: 2 V4 some text 12: 3 V4 13: 1 V5 20190801 14: 2 V5 15: 3 V5 some text 16: 2 V6 20190801 17: 3 V7 20170601
Из этого создается таблица соответствия
lut
blockquote>rn variable col 1: 1 V1 ColA 2: 1 V2 ColB 3: 1 V3 ColC 4: 1 V4 ColC 5: 1 V5 ColD 6: 2 V1 ColA 7: 2 V2 ColB 8: 2 V3 ColC 9: 2 V4 ColC 10: 2 V5 ColC 11: 2 V6 ColD 12: 3 V1 ColA 13: 3 V2 ColB 14: 3 V3 ColC 15: 3 V4 ColC 16: 3 V5 ColC 17: 3 V7 ColD
После присоединения обновления и перед преобразованием обратно в широкоформатный формат
long
выглядит какblockquote>rn variable value 1: 1 ColA 1 2: 2 ColA 2 3: 3 ColA 3 4: 1 ColB 10 5: 2 ColB 22 6: 3 ColB 30 7: 1 ColC some text... some text 8: 2 ColC some text... 9: 3 ColC some text... 10: 1 ColC 11: 2 ColC some text 12: 3 ColC 13: 1 ColD 20190801 14: 2 ColC 15: 3 ColC some text 16: 2 ColD 20190801 17: 3 ColD 20170601
Теперь элементы данных выровнены по соответствующим именам столбцов. .