Извлечение XML данных в R из таблицы на postgresql - PullRequest
2 голосов
/ 24 марта 2020

У меня есть таблица на postgresql, в которой есть столбец xml и столбцы varchar / figureri c. При попытке извлечь данные и сохранить их во фрейме данных 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","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)))

В результате я получаю полный столбец NA, что не соответствует ожиданиям. Пожалуйста, не могли бы вы помочь мне с этим вопросом? Я имею в виду, возможно, мое регулярное выражение не очень хорошо написано. И знаете ли вы, можно ли извлечь эту информацию непосредственно из запроса? Заранее благодарим за помощь, которую вы можете оказать.

С уважением

1 Ответ

1 голос
/ 24 марта 2020

У вас есть проблема с вашим регулярным выражением: это должно быть что-то вроде <result>(\\w+)</result>. Также для групповых матчей str_extract недостаточно. Вы можете использовать str_match для групп. Взгляните на str_match здесь .

В качестве альтернативного решения вы можете использовать XML парсер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...