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

Преобразуйте CSV в JSON или JSON в CSV — с определением разделителя, обработкой заголовков и преобразованием типов без потерь.

CSV
JSON

Здесь появится вывод

Что делает этот инструмент

CSV — это то, что выдают вам электронные таблицы, выгрузки из баз данных и аналитические панели; JSON — то, что нужно API и коду. Этот инструмент преобразует одно в другое в обоих направлениях, прямо в браузере. Вставьте CSV и получите JSON-массив — объекты с ключами из строки заголовка либо простые массивы, если заголовка в данных нет. Поменяйте направление, и JSON-массив снова станет CSV, где каждое значение заключено в кавычки ровно настолько, насколько это необходимо.

Работа выполняется на вашем устройстве, и здесь это важно: CSV — тот формат, в который выгружают списки клиентов, счета и аналитические выборки. Ничего из этого никуда не загружается.

Почему разбиения по запятым недостаточно

Очевидный способ читать CSV — разбивать каждую строку по запятым — ломается на реальных файлах, потому что у формата есть механизм экранирования. Поле в двойных кавычках может содержать разделитель, буквальную кавычку, записанную как две кавычки подряд, и даже переводы строк — тогда одна запись занимает несколько строк файла. Этот инструмент реализует настоящие правила (RFC 4180) посимвольным разбором, поэтому все три случая проходят невредимыми.

name,note
Grace,"rear admiral, USN"
Ada,"she said ""hello"""
Alan,"two
lines"

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

Разделитель часто не запятая

Вопреки названию, значения, разделённые запятыми, часто разделены не ими. В локалях, где запятая — десятичный разделитель (почти вся континентальная Европа), Excel выгружает с точкой с запятой, потому что 1,50 там число. Инструменты баз данных и командной строки часто выдают данные, разделённые табуляцией, а конвейеры логов любят вертикальные черты. Вставка такого файла в инструмент, знающий только запятую, даёт одну очень широкую колонку — самое частое разочарование при работе с CSV.

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

Заголовки и форма результата

Когда «первая строка — заголовок» включено, эта строка даёт имена ключей, а результат — массив объектов, то есть форма, которую ожидает почти любой API. Когда выключено, каждая строка становится массивом значений — это то, что нужно для файла, начинающегося сразу с данных.

  • Строка с меньшим числом полей, чем в заголовке, получает пустые строки в недостающих столбцах, а не ключи со значением undefined.
  • Повторяющиеся имена заголовков делаются уникальными (id, id_2, id_3) вместо перезаписи друг друга, из-за которой столбцы молча исчезали бы.
  • Пустая ячейка заголовка становится column_2, column_3 и так далее, чтобы ни один ключ не был пустой строкой.
  • Пустые строки пропускаются, как это делают импортеры электронных таблиц: вставленный файл нередко заканчивается лишним переводом строки, и строка пустых значений там выглядит как ошибка.

Преобразование типов, которое не может потерять данные

Каждое поле CSV — текст. Превращать похожий на числовой текст в числа JSON обычно именно то, что нужно, — но это же и способ незаметно уничтожить данные. Почтовый индекс 01234 превращается в 1234. Двадцатизначный номер заказа превращается в округлённое число с плавающей точкой. Цена, записанная как 1.50, теряет конечный ноль.

Правило, применяемое здесь, избегает всего этого без списка особых случаев: значение становится числом, только если обратное превращение в текст в точности воспроизводит исходное. 42 воспроизводит — значит, преобразуется. 01234 нет — значит, остаётся строкой. Так же и 1.50, +5, 1e5 и любое целое за пределами точности чисел с плавающей точкой. Строки true и false становятся логическими значениями; пустое поле остаётся пустой строкой, а не становится null, потому что CSV не способен выразить разницу между «нет значения» и «пустое значение», а выдумать её означало бы выдумать информацию.

Обратно в CSV

В обратном направлении массив объектов превращается в таблицу, столбцы которой — объединение всех ключей в порядке их первого появления: строки с разными ключами остаются выровненными, а отсутствующий ключ даёт пустую ячейку. Массив массивов записывается строка за строкой. Кавычки ставятся только там, где этого требует формат: значение, содержащее разделитель, кавычку или перевод строки, обёртывается, а внутренние кавычки удваиваются.

Значения, которые CSV не в состоянии представить — вложенный объект или массив, — записываются как JSON внутри своей ячейки, а не уплощаются и не отбрасываются, поэтому при преобразовании ничего не исчезает. Null становится пустой ячейкой.

Частые вопросы

Почему мой файл вышел одной гигантской колонкой?
Разделитель не тот, который использовал инструмент. Обычно это означает файл с точкой с запятой (стандарт Excel в европейских локалях, где запятая — десятичный разделитель) или выгрузку с табуляцией. Определение обычно это ловит: посмотрите, какой разделитель показан, и выберите другой из списка, если догадка оказалась неверной.
Почему мой идентификатор в JSON всё ещё строка?
Потому что преобразование изменило бы его. Числа преобразуются, только когда преобразование точно обратимо, поэтому 01234 сохраняет ведущий ноль, а длинные идентификаторы — каждую цифру. Если они действительно нужны как числа, данные должны быть записаны без ведущего нуля, либо преобразуйте позже там, где точность контролируете вы.
Что происходит с запятыми и кавычками внутри поля?
Они сохраняются. На входе поле в кавычках может содержать запятые, удвоенные кавычки и даже переводы строк; на выходе любое значение с разделителем, кавычкой или переводом строки заключается в кавычки, а внутренние кавычки удваиваются. Значение проходит CSV → JSON → CSV без изменений.
Загружаются ли мои данные куда-нибудь?
Нет. Разбор и преобразование выполняются целиком в вашем браузере, поэтому списки клиентов, выгрузки и отчёты, которые обычно живут в CSV, никогда не покидают ваше устройство.