Сравнить два CSV: что изменилось между выгрузками
Две выгрузки за соседние периоды, отправленный файл и ответ на него, справочник до и после обновления. Задача звучит просто, но привычные способы дают ответ, которому нельзя верить.
Почему построчное сравнение не работает
Инструменты сравнения текста (WinMerge, diff в редакторах) сопоставляют строки по позиции. Для таблицы это неверно: достаточно, чтобы в середину добавилась одна запись, и все последующие строки будут помечены как изменённые.
Кроме того, сортировка выгрузки могла поменяться — тогда «изменилось» будет вообще всё, при том что данные идентичны.
Таблицы сравнивают не по позиции, а по ключу: полю или набору полей, однозначно определяющих запись.
Почему ВПР недостаточно
Классический приём — свести обе выгрузки на один лист и сравнить формулой. Работает, но с оговорками:
- ВПР ответит, есть ли запись, но не скажет, какое поле изменилось — для этого нужна формула на каждую колонку;
- на паре сотен тысяч строк пересчёт занимает минуты;
- Excel по дороге уже испортил ведущие нули, и ключи перестали совпадать — самая обидная и самая частая причина ложных расхождений.
Как делать правильно
Порядок действий одинаков для любых двух таблиц:
- Выбрать ключ. Одно поле или несколько: номер записи, пара «полис + дата», код позиции. Ключ должен быть уникален — если нет, инструмент обязан сказать, сколько повторов встретилось.
- Сопоставить колонки по именам, а не по номерам: в новой версии выгрузки поле могли добавить в середину.
- Получить четыре числа: появилось, исчезло, изменилось, совпало. Их сумма должна сходиться с числом строк — это первая проверка на вменяемость результата.
- Посмотреть, что именно изменилось, с точностью до поля: было → стало.
В TablesViewer обе выгрузки открываются вкладками, ключ выбирается щелчком, а протокол расхождений выгружается в CSV — его можно передать тому, кто правит данные в системе.
Ловушки сравнения
- Пробелы.
"Иванов "и"Иванов"— разные строки. Подрезка краёв должна быть включена, иначе половина записей окажется «изменённой». - Регистр. Для кодов обычно важен, для фамилий — как правило нет. Это настройка, а не догма.
- Форматы чисел.
10.5и10,50— одно значение в разной записи. Сравнивать лучше приведённые значения, а не текст. - Неуникальный ключ. Если на один ключ приходится несколько записей, сравнение теряет смысл: нужно добавить в ключ ещё одно поле.
Частые вопросы
Можно ли сравнить CSV с DBF?
Да, если в обеих таблицах есть колонки с одинаковыми именами: формат источника для сравнения не важен.
Что если файлы отсортированы по-разному?
Для сравнения по ключу порядок строк не имеет значения.
Насколько это быстро?
Сравнение двух таблиц по полторы тысячи строк занимает десятки миллисекунд; на сотнях тысяч — секунды.