belun.app Блог
EN

CSV в JSON: разделители, кавычки и ловушка ведущего нуля

Как строка заголовка превращается в ключи, почему автоопределение лучше угадывания разделителя и какая типизация съедает ваши почтовые индексы.

Экран ноутбука с таблицей из строк и столбцов, которая преобразуется в массив JSON

Кто-то выгрузил таблицу, прислал вам .csv, и теперь это нужно как JSON — для запроса к API, файла конфигурации или короткого скрипта. Форма-то подходящая: строки и столбцы почти идеально ложатся на массив объектов. Почти. Ломается всё в трёх местах — разделитель, кавычки и то, что происходит с числами.

Строка заголовка становится ключами

Чистый случай — файл со строкой заголовка. Первая строка называет столбцы, всё остальное — записи:

name,role,city
Ada,Engineer,London
Linus,Maintainer,Portland

Получится два объекта, у каждого ключи name, role, city. Просто. Выключите заголовок — и на выходе будут массивы значений: это пригодится, когда файл — голая матрица без названий столбцов или когда первая строка уже данные, которые не хочется отдавать под ключи. Выбирайте то, что подходит вашему файлу.

Разделитель редко бывает запятой

CSV расшифровывается как «значения, разделённые запятыми», а потом половина файлов, которые вам попадаются, ими не разделены. Выгрузка из немецкого или французского Excel идёт через точку с запятой, потому что в этих локалях запятая уже занята под десятичный разделитель. Таблица из базы данных часто приходит с табуляцией. Вертикальная черта встречается в дампах логов.

Ошибка с разделителем — самая частая причина, по которой «CSV» сваливается в один огромный столбец. Поэтому конвертер не считает запятую данностью: он читает первую строку, считает, сколько раз встречается каждый кандидат — запятая, точка с запятой, табуляция, черта, — и берёт победителя. Эвристика маленькая, но срабатывает почти всегда. А когда нет — в выпадающем списке можно задать нужный символ вручную.

Кавычки делают больше, чем кажется

Поле с запятой внутри — полный адрес или Smith, Jane — в сыром виде разорвало бы строку. Правило CSV, прописанное в RFC 4180, такое: это поле берут в двойные кавычки. Кавычку внутри значения удваивают — "Она сказала ""привет""". Здешний парсер следует этому буквально, поэтому поле в кавычках спокойно держит запятые, переносы строк и экранированные кавычки, а строка всё равно разбивается там, где надо. Наивные конвертеры, которые просто режут по запятой, спотыкаются ровно на этом: экспорт контактов с одним адресом внутри даёт JSON, где каждая запись после 40-й строки сдвинута на столбец влево.

Ловушка ведущего нуля

Вот что тихо портит данные. Вы хотите, чтобы "42" стало числом 42, а не строкой "42" — ради этого типизация и нужна. Но переводить всё подряд опасно. Российский индекс 101000 ещё пройдёт, а вот код вроде 007, телефон или немецкий индекс, начинающийся с нуля, теряют первые цифры в ту же секунду, как их сочтут числом.

Поэтому определение типов здесь нарочно узкое. Оно переводит обычные целые и дробные числа и слова true и false, но всё, что начинается с нуля, остаётся строкой. Если вам удобнее оставить каждое значение текстом и разбираться с типами дальше самим, выключите переключатель «Типизация значений» — и ничего не приведётся.

Попробуйте

Вставьте свой CSV или перетащите файл .csv, проверьте, что число строк и столбцов выглядит правильно, и скопируйте JSON прямо в редактор. Всё работает в браузере — ничего не загружается, — так что даже список клиентов с настоящими именами остаётся на вашей машине. Откройте конвертер CSV в JSON и попробуйте на том, что лежит у вас в загрузках.

Попробуйте инструмент

Конвертер CSV в JSON →