从postgresql上的表中提取R中的XML数据
我有一个关于postgresql的表,它有一个xml列和一个varchar/numeric列。当试图检索数据并将其保存到数据帧时,xml将转换为字符。让我们重新创建数据集:从postgresql上的表中提取R中的XML数据,r,regex,postgresql,R,Regex,Postgresql,我有一个关于postgresql的表,它有一个xml列和一个varchar/numeric列。当试图检索数据并将其保存到数据帧时,xml将转换为字符。让我们重新创建数据集: my_dataset <- data.frame(id = c(1,1,1,1,2,2,2,2,2), http_action = c("REQUEST","RESPONSE","REQUEST","RESPONSE","REQUEST","RESPONSE","REQ
my_dataset <- data.frame(id = c(1,1,1,1,2,2,2,2,2),
http_action = c("REQUEST","RESPONSE","REQUEST","RESPONSE","REQUEST","RESPONSE","REQUEST","RESPONSE","RESPONSE"),
http_data = c('"<?xml version="1.0" standalone="yes"?> <questions> <candidate> <lastname>GOMEZ</lastname> <name>BARNEY</name> </candidate> </questions>)"',
'"<validating> <opnum>123</opnum> <q1>Daily activity?</q1> <a1>Drinking at Moes</a1></validating>"',
'"<?xml version="1.0" standalone="yes"?> <questions> <option>1</option> </questions>"',
'"<validating> <code>XY936701</code> <date>12/03/2020</date> <time>19:07</time> <result>NONAUTHORIZED</result> <explanation>NON SUITABLE</explanation> </validating>"',
'"<?xml version="1.0" standalone="yes"?> <questions> <candidate> <lastname>LEONARD</lastname> <name>LEN</name> </candidate> </questions>)"' ,
'"<validating> <opnum>124</opnum> <q1>Daily activity?</q1> <a1>Work at Nuclear Power</a1></validating>"',
'"<?xml version="1.0" standalone="yes"?> <questions> <option>1</option> </questions>"',
'"<validating> <code>XY936702</code> <date>15/03/2020</date> <time>16:12</time> <result>NONAUTHORIZED</result> <explanation>NON SUITABLE</explanation> </validating>"',
'"<validating> <code>XY936702</code> <date>15/03/2020</date> <time>19:24</time> <result>AUTHORIZED</result> <explanation>SUITABLE</explanation> </validating>"'),
http_status = c(200,200,200,200,200,200,200,200,200),
stringsAsFactors = FALSE)
我收到以下警告:
In postgresqlExecStatement(conn, statement, ...) :
RS-DBI driver warning: (unrecognized PostgreSQL field type xml (id:142) in column 4)
我可以在包含节点的行上使用字符串比较来提取信息,我尝试了以下方法:
my_dataset <- my_dataset %>%
mutate(authorized = ifelse(str_extract(http_data,"<result>[w+]</result>")=="",NA,
ifelse(str_extract(http_data,"<result>[w+]</result>")=="NONAUTHORIZED",0,1)))
my_数据集%
mutate(authorized=ifelse(str_-extract(http_-data,“[w+]”)==”,NA,
ifelse(str_extract(http_数据,[w+])==“未授权”,0,1)))
因此,我得到了一个完整的NA列,这不是我所期望的。请你帮我回答这个问题好吗?我的意思是,也许我的正则表达式写得不好。而且,您知道是否可以直接从查询中提取这些信息吗?提前感谢您提供的帮助
关于您的正则表达式有问题:它应该类似于
(\\w+)
。此外,仅获取组匹配项str\u extract
是不够的。您可以对组使用str\u match
。看看str\u match
作为另一种解决方案,您可以使用XML解析器。Hello@can,我开始弄清楚为什么我的正则表达式不起作用,它不会提取您建议的
(\\w+
)。有一个问题,如果该列为char,我如何使用xml解析器?作为一种快速而肮脏的方式,您可以这样做比较:str\u extract(http\u data,“\\w+”)==“未授权”
。对于xml解析器,您可以查看文档或者这个链接:Hello@can,这种方式很好,但是您知道我是否可以只提取标记中的文本吗?使用str_match
和我给出的第一个正则表达式()
将实际需要的零件分组。使用str_match
你可以看到组匹配。你好@can,谢谢,很有趣的是,每次我输入“一个xml”,我的Mac都建议写“一个xml”。