[英]How to parse key value pair of url string in R with multiple conditions
我有以下格式的字符串:
a <- c("first_name=James(Mr), cust_id=98503(ZZW_LG,WGE,zonaire),
StartDate=2015-05-20, EndDate=2015-05-20, performance=best")
我的目标是在如下数据框中获得最终结果:
first_name cust_id start_date end_date performance cust_notes
James(Mr) 98503 2015-05-20 2015-05-20 best ZZW_LG,WGE,zonaire
我运行了以下代码:
a <- c("first_name=James(Mr), cust_id=98503(ZZW_LG,WGE,zonaire),
StartDate=2015-05-20, EndDate=2015-05-20, performance=best")
split_by_comma <- strsplit(a,",")
split_by_equal <- lapply(split_by_comma,strsplit,"=")
由于监护人有其他逗号和括号,所以我没有得到期望的结果。
请注意,名字中的括号是真实的,需要被使用。
您需要以此拆分。
,(?![^()]*\\))
您需要lookahead
。这将不会被分裂,
内()
看到演示。
https://regex101.com/r/uF4oY4/82
为了获得理想的结果使用
split_by_comma <- strsplit(a,",(?![^()]*\\))",perl=TRUE)
split_by_equal <- lapply(split_by_comma,strsplit,"=")
如果您的字符串格式为true,则可能是一种快速的解决方案:
library(httr)
a <- c("first_name=James(Mr), cust_id=98503(ZZW_LG,WGE,zonaire), StartDate=2015-05-20,
EndDate=2015-05-20, performance=best")
dat <- data.frame(parse_url(sprintf("?%s", gsub(",[[:space:]]+", "&", a)))$query,
stringsAsFactors=FALSE)
library(tidyr)
library(dplyr)
mutate(separate(dat, cust_id, into=c("cust_id", "cust_notes"), sep="\\("),
cust_notes=gsub("\\)", "", cust_notes))
## first_name cust_id cust_notes StartDate EndDate performance
## 1 James(Mr) 98503 ZZW_LG,WGE,zonaire 2015-05-20 2015-05-20 best
外推法:
gsub(",[[:space:]]+", "&", a)
使参数看起来像URL查询字符串的组成部分。 sprintf(…)
使它看起来像一个实际的查询字符串 parse_url
(来自httr
)将把键/值对分离出来,并将它们粘贴在返回列表的列表(命名query
)中 data.frame
将会…… separate
将拆分cust_id
在你列(
分成两列 mutate
将删除)
在新cust_notes
列 这就是“管道”的全部内容:
library(httr)
library(tidyr)
library(dplyr)
library(magrittr)
a <- c("first_name=James(Mr), cust_id=98503(ZZW_LG,WGE,zonaire), StartDate=2015-05-20,
EndDate=2015-05-20, performance=best")
a %>%
gsub(",[[:space:]]+", "&", .) %>%
sprintf("?%s", .) %>%
parse_url() %>%
extract2("query") %>%
data.frame(stringsAsFactors=FALSE) %>%
separate(cust_id, into=c("cust_id", "cust_notes"), sep="\\(") %>%
mutate(cust_notes=gsub("\\)", "", cust_notes))
符合外推法,并且(IMO)更易于遵循。
回复较晚,但由于它非常易于理解和实现,因此无需使用任何其他软件包就发布了它
rawdf = read.csv("<your file path>", header = F, sep = ",", stringsAsFactors = F)
# Get the first row of the dataframe and transpose it into a column of a df
colnames = data.frame(t(rawdf[1,]))
# Split the values of the single column df created above into its key value
# pairs which are separated by '=' and save in a vector
colnames = unlist(strsplit(as.character(colnames$X1), "="))
# Pick up all the odd indexed values from the above vector (all odd places
# are colnames and even places the values associated with them)
colnames = colnames[seq(1,length(colnames),2)]
# Assign the extracted column names from the vector above to your original data frame
colnames(rawdf) = colnames
# Use the regex to extract the value in each field of the original df by
# replacing the 'Key=' pattern present in each field with an empty string
for(i in 1:dim(rawdf)[2]) rawdf[,i] = gsub(paste(colnames[i],"=",sep=""), "", rawdf[,i])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.