#json #parsing #marklogic #data-cleaning
#json #синтаксический анализ #marklogic #очистка данных
Вопрос:
Я работаю с MarkLogic 10. У меня есть база данных, которая загружена данными JSON. У меня есть одно поле, которое не было проанализировано. Что я хотел бы сделать, это что-то вроде: Образец данных:
{"books": {"Harry Potter": {"text": "There are several harry potter books:/n-Chamber of Secrets/n--chess/n--dog/n-Goblet of Fire/n--dragon/n--broomstick "}
Желаемый результат выглядит примерно так:
{"books": {"Harry Potter": {"subject": "There are several harry potter books:",
"book 1" : {
"title": "-Chamber of Secrets",
"Contents 1" : "--chess",
"Contents 2" : "--dog"},
"book 2" : {
"title":"-Goblet of Fire",
"Contents 1" : "--dragon",
"Contents 2" : "--broomstick"}}}}
Есть ли у MarkLogic функция, которая может легко это сделать?
Комментарии:
1. Неясно, как вы ожидаете перейти от образца ввода к образцу вывода. Можете ли вы описать логику и то, что обозначает разные книги? Почему бы не использовать массив объектов book вместо вложенной структуры?
2. Хорошо, не используя конкретно приведенный выше пример, здесь есть основной элемент, в котором указано «Список выполненных задач», что было выполнено корневым узлом, вторичным узлом, первой задачей в этом первом цикле подзадачи задачи через все задачи и подзадачи с использованием MarkLogic. Выше будет указано, что сделано сегодня, а затем задача, если есть подзадача, они будут узлами в этом узле. и т. Д
Ответ №1:
Для сопоставления строк в текстовой строке со свойствами выходного объекта потребуется сценарий.
Функции, доступные в серверном JavaScript, могут выполнять это сопоставление:
- Разделите значение свойства text на массив строк в символе новой строки с помощьюhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split
- Уменьшите массив с помощьюhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
Начальным значением для редуктора может быть объект JavaScript, который содержит как состояние (глубину предыдущего узла в дереве), так и текущий выходной объект (инициализированный соответствующим образом).
Функция reducer может выполнять следующее:
- Сопоставьте начальные дефисы для текущей строки сhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match
- Получите длину строки с начальным дефисом, чтобы определить текущую глубинуhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length
- Обновите состояние и выходной объект на основе глубины:
- Откройте новый объект, если текущая глубина больше предыдущей глубины.
- Закройте предыдущий объект, если текущая глубина меньше предыдущей глубины.
- Добавьте свойство с той же глубиной, если предыдущая глубина одинакова.
Сопоставление также может быть выполнено на клиентских языках с поддержкой JSON перед загрузкой.
Надеюсь, это поможет,
Комментарии:
1. У меня есть способ использовать это в MarkLogic Qconsole
2. Да, JavaScript в соответствии с описанными выше линиями должен работать в буфере SJS QueryConsole (серверный JavaScript) или в модуле MarkLogic SJS.