使用 data.table 在指定关键字之间提取字符串的第一个实例的最佳方法
Best method to extract the first instance of a string between specified keywords using data.table
我想使用 data.table 提取特定单词后的字符串。
主题:
从到:
日期:
消息:
预期输入:
主题:欢迎 \r\nFrom:(Jane Doe)JaneDoe@emaildomain。com\r\nTo:
(Foo Bar) Foo.Bar@emaildomain.com\r\nDate: 1/1/2019 7:01:32 AM\r\n\r\n 从我的 iPhone\r\n\r\nBegin 转发的消息发送:\r\n\r\nFrom:X先生
我尝试了一些函数,但无法获得仅提取字符串的第一个实例而忽略后续字符串的代码。我也有问题只捕获我正在寻找的部分。
library(data.table)
x<- as.data.table("Subject: Welcome \r\nFrom: (Jane Doe) JaneDoe@emaildomain.com\r\nTo:
(Foo Bar) Foo.Bar@emaildomain.com\r\nDate: 1/1/2019 7:01:32 AM\r\n\r\n Sent from my iPhone\r\n\r\nBegin forwarded message:\r\n\r\nFrom: Mr. X <xxx@gmail.com","x1")
x[, Subject := sub('^.*Subject:\s*|\s*From:.*$', '', V1) ][]
x[, From := sub('^.*From:\s*|\s*To:.*$', '', V1) ][]
x[, To := sub('^.*To:\s*|\s*Date:.*$', '', V1) ][]
x[, Message := sub('^.*PM|AM\s*|\s*.*$', '', V1) ][]
x
当前结果:
V1
主题:欢迎 \r\nFrom: (Jane Doe) JaneDoe@emaildomain.com\r\nTo: \n (Foo Bar) Foo.Bar@emaildomain.com\r\nDate: 1/1/2019 7:01:32 AM\r\n\r\n 从我的 iPhone\r\n\r\nBegin 转发的消息发送:\r\n\r\nFrom:X 先生
发件人:X先生
发件人:X先生
消息:(空白)
您可以使用 Base R strcapture
函数:
prot = data.frame(setNames(replicate(4,character()),
c("Subject","From","To","Date")),stringsAsFactors = F)
patt = "Subject:\s*(.*?)\s*From:\s*(.*?)\s*To:\s*(.*?)\s*Date:\s*(.*(?:A|P)M)"
strcapture(patt,x$V1,prot)
Subject From To Date
1 Welcome (Jane Doe) JaneDoe@emaildomain.com (Foo Bar) Foo.Bar@emaildomain.com 1/1/2019 7:01:32 AM
在使用gsub
去除\r\n
后,我们可以使用tidyr::extract
将数据分成4列。
library(dplyr)
x %>%
mutate(V1 = gsub("\r|\n", "", V1)) %>%
tidyr::extract(V1, into = c("Subject", "From", "To", "Date"),
regex = ".*Subject:(.*)From:(.*)To:(.*)Date:(.*)A|PM.*")
# Subject From To
#1 Welcome (Jane Doe) JaneDoe@emaildomain.com (Foo Bar) Foo.Bar@emaildomain.com
# Date
# 1 1/1/2019 7:01:32
我想使用 data.table 提取特定单词后的字符串。
主题: 从到: 日期: 消息:
预期输入: 主题:欢迎 \r\nFrom:(Jane Doe)JaneDoe@emaildomain。com\r\nTo: (Foo Bar) Foo.Bar@emaildomain.com\r\nDate: 1/1/2019 7:01:32 AM\r\n\r\n 从我的 iPhone\r\n\r\nBegin 转发的消息发送:\r\n\r\nFrom:X先生
我尝试了一些函数,但无法获得仅提取字符串的第一个实例而忽略后续字符串的代码。我也有问题只捕获我正在寻找的部分。
library(data.table)
x<- as.data.table("Subject: Welcome \r\nFrom: (Jane Doe) JaneDoe@emaildomain.com\r\nTo:
(Foo Bar) Foo.Bar@emaildomain.com\r\nDate: 1/1/2019 7:01:32 AM\r\n\r\n Sent from my iPhone\r\n\r\nBegin forwarded message:\r\n\r\nFrom: Mr. X <xxx@gmail.com","x1")
x[, Subject := sub('^.*Subject:\s*|\s*From:.*$', '', V1) ][]
x[, From := sub('^.*From:\s*|\s*To:.*$', '', V1) ][]
x[, To := sub('^.*To:\s*|\s*Date:.*$', '', V1) ][]
x[, Message := sub('^.*PM|AM\s*|\s*.*$', '', V1) ][]
x
当前结果: V1 主题:欢迎 \r\nFrom: (Jane Doe) JaneDoe@emaildomain.com\r\nTo: \n (Foo Bar) Foo.Bar@emaildomain.com\r\nDate: 1/1/2019 7:01:32 AM\r\n\r\n 从我的 iPhone\r\n\r\nBegin 转发的消息发送:\r\n\r\nFrom:X 先生
发件人:X先生
发件人:X先生
消息:(空白)
您可以使用 Base R strcapture
函数:
prot = data.frame(setNames(replicate(4,character()),
c("Subject","From","To","Date")),stringsAsFactors = F)
patt = "Subject:\s*(.*?)\s*From:\s*(.*?)\s*To:\s*(.*?)\s*Date:\s*(.*(?:A|P)M)"
strcapture(patt,x$V1,prot)
Subject From To Date
1 Welcome (Jane Doe) JaneDoe@emaildomain.com (Foo Bar) Foo.Bar@emaildomain.com 1/1/2019 7:01:32 AM
在使用gsub
去除\r\n
后,我们可以使用tidyr::extract
将数据分成4列。
library(dplyr)
x %>%
mutate(V1 = gsub("\r|\n", "", V1)) %>%
tidyr::extract(V1, into = c("Subject", "From", "To", "Date"),
regex = ".*Subject:(.*)From:(.*)To:(.*)Date:(.*)A|PM.*")
# Subject From To
#1 Welcome (Jane Doe) JaneDoe@emaildomain.com (Foo Bar) Foo.Bar@emaildomain.com
# Date
# 1 1/1/2019 7:01:32