【问题标题】:extract every element that meets a pattern in a string in R提取满足R中字符串中模式的每个元素
【发布时间】:2018-12-11 21:50:36
【问题描述】:

我有一个字符串,基本上是一个 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") 这样的向量将是期望的输出。

我知道我可能需要使用正则表达式,但我无法提取每一个。

任何想法都会受到赞赏。

最好的,

【问题讨论】:

标签: r replace data-manipulation text-extraction


【解决方案1】:

1) grep/read.table grepEND AS 输出行,并使用read.tablesep 的双引号来阅读这些内容。第二列将是所需的数据。没有使用正则表达式或包。

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 使用与 (2) 中相同模式的另一种基本 R 方法是:

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\"")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 2022-08-04
    相关资源
    最近更新 更多