Страницы: 1
RSS
Загрузка большого json
 
Добрый день.
Ребята, подскажите, какие еще есть варианты обработки json в vba?
В данный момент я гружу из файлов с помощью библиотеки jsonbag. файл порядка 6-10 Мб, данные с сайта, выгруженные через консоль.
Грузится неимоверно долго, приходится срубать через Диспетчер задач.
 
Первый кандидат - Power Query.
Владимир
 
Он берет только верхний уровень, а у меня многоуровневый json с массивами и объектами.
Мне данные нужно еще проверить по условиям и вывести на лист в определенной структуре.
 
Тогда макрос нужно написать
(сколько конкретики в вопросе, столько же и в ответе)
 
Цитата
Игорь написал:
Тогда макрос нужно написать
так он и есть, с использованием jsonbag
 
Доброе время суток
Цитата
Владимир Л написал:
Он берет только верхний уровень, а у меня многоуровневый json с массивами и объектами.
Вам кто-то запрещает выполнить трансформации, чтобы вывести нужные уровни :qstn:  :excl:
 
Что касается "чистого" VBA, то из опубликованного есть известный парсер VBA-JSON Тима Холла. Главный его недостаток - создание ActiveX объектов и VBA массивов для объектов и массивов JSON, что медленно.
Владимир
 
Цитата
Андрей VG написал:
Вам кто-то запрещает выполнить трансформации, чтобы вывести нужные уровни  
Хотите сказать, что можно написать функцию ч циклом для обхода json объекта?
можно пример какой-нибудь? просто никогда не работал с этим инструментом.
 
Цитата
Владимир Л написал:
пример какой-нибудь
Забавно, а в правилах написано, что это вы должны представить пример - что есть что должно получиться :)  Тогда от балды на примере таких данных
Код
let
    Source = Json.Document("{""a"":123,""b"":[1,2,3,4],""c"":{""d"":456}}"),
    toTable = Table.FromRecords({Source}),
    expandRecords = Table.ExpandRecordColumn(toTable, "c", {"d"}, {"c.d"}),
    expandList = Table.ExpandListColumn(expandRecords, "b")
    
in
    expandList
 
Цитата
Андрей VG написал:
вы должны представить пример
Что-то вроде этого:
Код
{
"data":{
    "pole1":1,
    "pole2":2,
    "records":[{
        "id":1,
        "steps":[{
            "stepNumber":1,
            "answer": "текст",
            "state": "/1/2/3/4/5",
            "FromState": "/1/2/3/4/5.1-1",
            "events":[{
                "eventType": "question",
                "question": "Вопрос клиента"
                },{
                "eventType": "answer",
                "question": "ответ"
                }]
            "tags":[{
                 "stepNumber":1,
                 "name":"question",
                 "value":"ok"
                 },{}]
            },{
            "stepNumber":2,
            "answer": "текст",
            "tags":[{
                 "stepNumber":1,
                 "name":"question",
                 "value":"err"
                 },{}]
            
            }]
     },{
        "id":2,
        "steps":[{
            "stepNumber":1,
            "answer": "текст",
            "state": "/1/2/3/4/5/6",
            "tags":[{
                 "stepNumber":1,
                 "name":"question",
                 "value":"ok"
                 },{}]
            },{
            "stepNumber":2,
            "answer": "текст",
            "tags":[{
                 "stepNumber":1,
                 "name":"question",
                 "value":"ok"
                 },{}]
            
            }]     
     }]
}
}

Соответственно записей records, шагов steps может быть несколько.
Нужно обойти все записи, проверить  tags, если в tags есть что-то, то вывести value, state, id, event.question, сравнить state и FromState и определить флаг совпадения  и пр. и каждый такой элемент вывести в строку.

В идеале нужно сделать инструмент для тупого пользователя, чтобы он открыл ексель, загрузил файл  json и на лист ему вывалился необходимы список.
Да, для понимания - это сессии чат-бота с клиентами, которые размечены специалистами.
Простите за код, не нашел сворачивалку +

На данный момент, как и говорил, это реализовано с помощью библиотеки, но файл в 8 Мб может обрабатывать ооооочень долго, там порядка 350000 строк.
Изменено: Владимир Л - 07.08.2020 07:58:29
 
Владимир Л, вы уверены, что если представить не валидный json
Цитата

          "events":[{
               "eventType": "question",
               "question": "Вопрос клиента"
               },{
               "eventType": "answer",
               "question": "ответ"
               }]
           "tags":[{
                "stepNumber":1,
                "name":"question",
                "value":"ok"
                },{}]
           }
, пример входа, в котором нет
Цитата
Владимир Л написал:
если в tags есть что-то,
, и не приложить, что по примеру входа должно получиться на выходе, то это самый эффективный способ заинтересовать помогающих и получить быстрый ответ и решение? :)
P. S. По крайней мере я пошёл гулять лесом - это для здоровья полезнее, чем быть в очередной раз обвинённым в не клиентоориентированности.
Изменено: Андрей VG - 07.08.2020 08:11:54
 
Цитата
Андрей VG написал:
вы уверены, что если представить не валидный json
простите, у меня через Ж весь интернет работает, мог пропустить ,
Сейчас должен быть валидный.
Код
{
"data":{
    "pole1":1,
    "pole2":2,
    "records":[{
        "id":1,
        "steps":[{
            "stepNumber":1,
            "answer": "текст",
            "state": "/1/2/3/4/5",
            "FromState": "/1/2/3/4/5.1-1",
            "events":[{
                "eventType": "question",
                "question": "Вопрос клиента"
                },{
                "eventType": "answer",
                "question": "ответ"
                }],
            "tags":[{
                 "stepNumber":1,
                 "name":"question",
                 "value":"ok"
                 },{}]
            },{
            "stepNumber":2,
            "answer": "текст",
            "tags":[{
                 "stepNumber":1,
                 "name":"question",
                 "value":"err"
                 },{}]
             
            }]
     },{
        "id":2,
        "steps":[{
            "stepNumber":1,
            "answer": "текст",
            "state": "/1/2/3/4/5/6",
            "tags":[{
                 "stepNumber":1,
                 "name":"question",
                 "value":"ok"
                 },{}]
            },{
            "stepNumber":2,
            "answer": "текст",
            "tags":[{
                 "stepNumber":1,
                 "name":"question",
                 "value":"ok"
                 },{}]
             
            }]     
     }]
}
}

 
Цитата
Андрей VG написал:
Владимир Л  написал:если в tags есть что-то,
если ничего нет, то он будет пуст tags: []
Страницы: 1
Наверх