извлечь каждый элемент, который соответствует шаблону в строке в R - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть строка, в основном это оператор SQL.Я хочу извлечь часть этого.Вот код

 SELECT 
 DTE as "Date",
 CURRENT_DATE AS "Day",
 concat( BCCO, BCBCH ) AS "client/batch",
 BCSTAT as "Batch Status",
 CASE 
  WHEN EXC = 'MCR' THEN CNT 
  ELSE 0 
 END AS "MCR-NPR",
 CASE 
  WHEN EXC = 'NRC' THEN CNT 
  ELSE 0 
 END AS "NRC-NPR",
 CASE 
  WHEN EXC = 'OFD' THEN CNT 
  ELSE 0 
 END AS "OFD-NPR",
 CASE 
  WHEN EXC = 'TDB' THEN CNT 
  ELSE 0 
 END AS "TDB-NPR",
 CASE 
  WHEN EXC = 'TDC' THEN CNT 
  ELSE 0 
 END AS "TDC-NPR",
 CASE 
  WHEN EXC = 'UDC' THEN CNT 
  ELSE 0 
 END AS "UDC-NPR",
 CASE 
  WHEN EXC = 'BIN' THEN CNT 
  ELSE 0 
 END AS "BIN-WRN",
 CASE 
  WHEN EXC = 'DSP' THEN CNT 
  ELSE 0 
 END AS "DSP-WRN",

Я хочу извлечь каждый элемент между END AS и цитатой.Такой вывод ("MCR-NPR", ..., "DSP-WRN") будет желаемым результатом.

Я знаю, что мне может понадобиться использовать регулярное выражение, но я не смог извлечь всеиз них.

Любая идея будет оценена.

Лучший,

1 Ответ

0 голосов
/ 12 декабря 2018

1) grep / read.table grep из строк с END AS и использование read.table с sep в двойных кавычках для их чтения.Во втором столбце будут нужные данные.Регулярные выражения или пакеты не используются.

read.table(text = grep("END AS", s, value = TRUE, fixed = TRUE), 
  sep = '"', as.is = TRUE)[[2]]
## [1] "MCR-NPR" "NRC-NPR" "OFD-NPR" "TDB-NPR" "TDC-NPR" "UDC-NPR" "BIN-WRN"
## [8] "DSP-WRN"

1a) Это похоже на (1), но использует sub с регулярным выражением вместо read.table:

sub('.*END AS "(.+)".*', "\\1", grep("END AS", s, value = TRUE))
## [1] "MCR-NPR" "NRC-NPR" "OFD-NPR" "TDB-NPR" "TDC-NPR" "UDC-NPR" "BIN-WRN"
## [8] "DSP-WRN"

2) strapply Другой подход заключается в следующем.Он использует тот факт, что нужные строки следуют END AS и заключены в двойные кавычки. Он имеет самый короткий код из приведенных здесь.

library(gsubfn)
unlist(strapplyc(s, 'END AS "(.+)"'))
## [1] "MCR-NPR" "NRC-NPR" "OFD-NPR" "TDB-NPR" "TDC-NPR" "UDC-NPR" "BIN-WRN"
## [8] "DSP-WRN"

3) strcapture Другая базаПодход R с использованием того же шаблона, что и в (2):

na.omit(strcapture('END AS "(.+)"', s, list(value = character(0))))

, дающий:

     value
9  MCR-NPR
13 NRC-NPR
17 OFD-NPR
21 TDB-NPR
25 TDC-NPR
29 UDC-NPR
33 BIN-WRN
37 DSP-WRN

Примечание

Ввод s в воспроизводимой форме:

s <- 
c("SELECT ", " DTE as \"Date\",", " CURRENT_DATE AS \"Day\",", 
" concat( BCCO, BCBCH ) AS \"client/batch\",", " BCSTAT as \"Batch Status\",", 
" CASE ", "  WHEN EXC = 'MCR' THEN CNT ", "  ELSE 0 ", " END AS \"MCR-NPR\",", 
" CASE ", "  WHEN EXC = 'NRC' THEN CNT ", "  ELSE 0 ", " END AS \"NRC-NPR\",", 
" CASE ", "  WHEN EXC = 'OFD' THEN CNT ", "  ELSE 0 ", " END AS \"OFD-NPR\",", 
" CASE ", "  WHEN EXC = 'TDB' THEN CNT ", "  ELSE 0 ", " END AS \"TDB-NPR\",", 
" CASE ", "  WHEN EXC = 'TDC' THEN CNT ", "  ELSE 0 ", " END AS \"TDC-NPR\",", 
" CASE ", "  WHEN EXC = 'UDC' THEN CNT ", "  ELSE 0 ", " END AS \"UDC-NPR\",", 
" CASE ", "  WHEN EXC = 'BIN' THEN CNT ", "  ELSE 0 ", " END AS \"BIN-WRN\",", 
" CASE ", "  WHEN EXC = 'DSP' THEN CNT ", "  ELSE 0 ", " END AS \"DSP-WRN\"")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...