У меня есть строка таких символов в R
ABCDE,"January 10, 2010",F,,,,GH,"March 9, 2009",,,
Я хотел бы сделать что-то вроде str.split()
для разделения всех комбинаций запятых и кавычек в массив строк, но сохранить запятые в кавычках, которые представляют даты, чтобы я получил:
ABCDE
January 10, 2010
F
GH
March 9, 2009
Спасибо
Если шаблон такой, как показано, то вариант регулярного выражения будет состоять в том, чтобы создать разделитель и использовать read.table
read.table(text = gsub('"', '', gsub('("[^,"]+,)(*SKIP)(*FAIL)|,',
'\n', trimws(gsub(",{2,}", ",", str1), whitespace = ","), perl = TRUE)),
header = FALSE, fill = TRUE, sep = "\n")
-вывод
V1
1 ABCDE
2 January 10, 2010
3 F
4 GH
5 March 9, 2009
Или с scan
data.frame(V1 = setdiff(scan(text = str1, sep = ",",
what = character()), ""))
-вывод
V1
1 ABCDE
2 January 10, 2010
3 F
4 GH
5 March 9, 2009
str1 <- "ABCDE,\"January 10, 2010\",F,,,,GH,\"March 9, 2009\",,,"
Спасибо, я нашел, что это самый простой подход!
@Ed_Gravy Я думаю, что решение AndreWildberg намного лучше моего, если OP помечает решение, пожалуйста, сделайте это с этим. Спасибо
Это один подход
data.frame(list = na.omit(
unname(unlist(read.csv(
text = 'ABCDE,"January 10, 2010",F,,,,GH,"March 9, 2009",,,',
check.names = F, header = F)))))
list
1 ABCDE
2 January 10, 2010
3 FALSE
4 GH
5 March 9, 2009
Вероятно, вам следует использовать здесь парсер CSV, но если вы хотите использовать чистое регулярное выражение, вы можете попробовать:
library(stringr)
library(dplyr)
x <- "ABCDE,\"January 10, 2010\",F,,,,GH,\"March 9, 2009\",,,"
y <- str_match_all(x, "\"(.*?)\"|[^,]+")[[1]]
output <- coalesce(y[,2], y[,1])
output
[1] "ABCDE" "January 10, 2010" "F" "GH"
[5] "March 9, 2009"
Шаблон регулярного выражения использует трюк с чередованием и говорит, что он соответствует:
"(.*?)"
сопоставьте дату в кавычках, но не захватывайте кавычки|
ИЛИ[^,]+
соответствует одному термину CSVДругой вариант может быть:
na.omit(stack(read.csv(text = str1, header = FALSE)))[1]
values
1 ABCDE
2 January 10, 2010
3 FALSE
4 GH
5 March 9, 2009
txt <- 'ABCDE,"January 10, 2010",F,,,,GH,"March 9, 2009",,,'
Если даты всегда указаны в двойных кавычках, вы можете проанализировать их с помощью
regmatches( data,gregexec('"([^"]*)"|([^,]*),?', data))
. Вторая и третья строки будут содержать результаты без кавычек.