XML в таблицу: где Excel подводит
Excel умеет импортировать XML — и на плоских файлах делает это прилично. Проблемы начинаются там, где внутри записи есть список: именно тогда суммы начинают задваиваться, а ошибку почти невозможно заметить глазами.
Откуда берётся задвоение
Представьте случай лечения на сумму 5 000 рублей, внутри которого три услуги. Таблица должна быть либо одной строкой (случай), либо тремя (услуги). Excel при развороте вложенности делает третье: три строки, и в каждой повторяется сумма случая.
Это называется декартовым произведением. Сумма по такой таблице даст 15 000 вместо 5 000. Если услуг у случаев разное количество, ошибка будет неравномерной — и проверить её сложением «в уме» не получится.
Беда в том, что таблица при этом выглядит совершенно нормально.
Правильная постановка вопроса
Прежде чем разворачивать XML, нужно ответить: что является строкой. Ответ зависит от задачи, и он может меняться от вопроса к вопросу в пределах одного файла.
Если строка — случай, то список услуг внутри нужно либо свернуть (склеить значения, посчитать количество), либо не показывать. Если строка — услуга, то данные случая повторяются в каждой строке осознанно, и суммировать нужно поле услуги, а не поле случая.
Инструмент обязан сделать этот выбор явным. TablesViewer показывает, какие элементы повторяются и сколько раз, предлагает подходящий и прямо сообщает, если внутри строки остались повторяющиеся вложенные элементы: их значения склеиваются через разделитель, и рядом подсказка — переключитесь на этот уровень, чтобы развернуть.
Атрибуты — тоже данные
Половина XML-выгрузок хранит значения не в тексте элементов, а в атрибутах: <row id="1" name="Первый"/>. Часть инструментов про них забывает и показывает пустую таблицу с правильным числом строк.
Атрибуты должны становиться колонками наравне с вложенными элементами — с понятной пометкой, чтобы не путать @id (атрибут) и id (вложенный элемент), когда в документе есть оба.
Имена колонок из путей
При разворачивании вложенных элементов имя колонки собирается из пути: PACIENT/SNILS. Это длиннее, чем просто SNILS, зато не возникает коллизий — а они неизбежны, когда одно и то же имя встречается на разных уровнях (DATE у случая и у услуги).
При выгрузке в DBF, где имя поля не длиннее десяти символов, такие имена сокращаются — и программа обязана сказать, как именно, а не молча обрезать.
Частые вопросы
Можно ли доверять сводной таблице по импортированному XML?
Только если вы уверены, что вложенность не разворачивалась в декартово произведение. Проверьте общую сумму по одному известному случаю.
Как посчитать количество услуг в случае?
Открыть таблицу на уровне услуг и сгруппировать по идентификатору случая с показателем «количество».
Что делать с очень глубокой вложенностью?
Выбирать уровень, на котором лежат нужные данные, а не разворачивать всё сразу: колонок получится сотни, и работать с ними невозможно.