Разбор 'json-подобного' текста - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь разобрать строку в следующем формате:

[{'name': 'Mae Tech', 'id': 102}, {'name': "Walters' Company", 'id': 98}, 
  {'name': 'Brad & Bouy Inc.', 'id': 678}, {'name': 'Dowi Enterprises', 'id': 7678}, 
  {'name': 'Gamer Boys', 'id': 7678}, {'name': 'LogoMan', 'id': 3456}]

Вот проблема, с которой я сталкиваюсь:

  • Я не могу преобразовать это в jsonпотому что поле содержит одинарные кавычки, а не двойные.
  • Я не могу gsub удвоить одинарные кавычки из-за апострофов в имени.
  • Я могу работать с регулярным выражением, но яне уверен, что все символы для включения в качестве условия моего соответствия.Пока у меня есть: 'name': ('|\")[A-Za-z .'-]*"

Но мне нужно проверить множество полей, чтобы убедиться, что я не пропустил ни одного.

Есть более простые идеи?

1 Ответ

0 голосов
/ 16 марта 2019

Вы можете использовать разделение строк вместо сопоставления с регулярными выражениями - например, разделить в },, удалить []{, разделить в ,, разделить в :\\s, удалить ^[\\'\\"] и [\\'\\"]$ (или просто удалить первый и последний символ строковых значений, так как это будут кавычки тот или иной вид).

Вот tidyverse версия, но есть и другие способы ...

library(tidyverse) #uses dplyr and stringr

x <- "[{'name': 'Mae Tech', 'id': 102}, {'name': \"Walters' Company\", 'id': 98}, 
  {'name': 'Brad & Bouy Inc.', 'id': 678}, {'name': 'Dowi Enterprises', 'id': 7678}, 
  {'name': 'Gamer Boys', 'id': 7678}, {'name': 'LogoMan', 'id': 3456}]"

str_split(x, "\\},")[[1]] %>%                            #split at "},"
  str_remove_all("[\\[\\]\\{\\}]") %>%                   #remove assorted brackets "{}[]"
  str_split_fixed(", ", 2) %>%                           #split at ", "
  as.data.frame(stringsAsFactors = FALSE) %>%            #convert to dataframe
  set_names(c("name", "id")) %>%                         #set column names
  mutate_all( ~ str_trim(str_remove(., ".+:\\s+"))) %>%  #remove bit up to ": " and trim
  mutate(name = substr(name, 2, nchar(name) - 1))        #remove end quotes from name

              name   id
1         Mae Tech  102
2 Walters' Company   98
3 Brad & Bouy Inc.  678
4 Dowi Enterprises 7678
5       Gamer Boys 7678
6          LogoMan 3456
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...