Конвертация CSV в JSON и обратно без потери данных
CSV — это простая текстовая таблица: одна запись на строку, поля разделены разделителем, обычно запятой. Всё ломается, когда в поле есть разделитель, двойная кавычка или перенос строки, потому что программа должна отличать структуру от содержимого. Соблюдайте правила кавычек, проверяйте разделитель и строку заголовков и храните числа с ведущими нулями как текст. Остальная часть статьи рассказывает о том, что сохраняется при обратном преобразовании, а что нет.
CSV в JSONНужно перевести CSV в JSON или обратноСделать бесплатноЧто такое CSV-файл на самом деле
Единого обязательного стандарта для CSV нет, но RFC 4180 описывает распространённый вариант, и большинство программ ему следует. Его основные правила умещаются в короткий список:
- Каждая запись занимает отдельную строку, и RFC требует, чтобы строки заканчивались возвратом каретки и переводом строки, CRLF.
- Поля разделяются запятыми.
- Поле, содержащее запятую, двойную кавычку или перенос строки, заключается в двойные кавычки.
- Двойная кавычка внутри поля в кавычках записывается как две двойные кавычки.
Поэтому строка 1001,"Smith, Ann",02134 содержит три поля, потому что запятая внутри кавычек — это содержимое. Разбиение по каждой запятой даст четыре. Просмотрщик fixmint применяет эти правила: поле в кавычках может содержать разделитель, переносы строк и удвоенные кавычки, а незакрытая кавычка выводится с номером строки, где она начинается.
Почему меняется разделитель
Запятая — разделитель по умолчанию в RFC, но там, где запятая служит десятичным знаком (так что 1,5 означает полтора), таблицы часто сохраняются в CSV с точкой с запятой. Файлы с табуляцией (TSV) избегают конфликта в большинстве данных, потому что табуляция редко встречается внутри текста.
В меню «Разделитель» есть варианты: «Авто», «Запятая», «Точка с запятой», «Табуляция» и «Вертикальная черта». Режим «Авто» читает первые десять строк, подсчитывает каждый возможный разделитель вне кавычек и выбирает тот, у которого число на строку наиболее стабильно. Если «Авто» ошибается, выберите разделитель вручную.
Конвертация в fixmint
В разборе используются параметры по умолчанию инструмента CSV в JSON.
Пример
Вставьте этот CSV, с включённой опцией «Первая строка — заголовок»:
id,name,zip,note
1001,"Smith, Ann",02134,"She said ""hi"""
1002,Bo,10001,"line one
line two"
При выключенной опции «Преобразовывать числа», отступе JSON в 2 пробела инструмент вернёт:
[
{
"id": "1001",
"name": "Smith, Ann",
"zip": "02134",
"note": "She said \"hi\""
},
{
"id": "1002",
"name": "Bo",
"zip": "10001",
"note": "line one\nline two"
}
]
При включённой опции «Преобразовывать числа» значения id и zip 10001 становятся числами, а 02134 остаётся текстом.
Шаги
- Вставьте CSV или перетащите файл .csv, .tsv, .txt или .json.
- Проверьте «Первая строка — заголовок», «Разделитель» и «Преобразовывать числа». Выберите отступ JSON в 2 пробела, табуляцию или «Без отступов».
- Скопируйте результат или скачайте его как .json.
Храните числа как текст
Числа в JSON не могут иметь ведущих нулей, поэтому 02134 — не корректное число JSON. Почтовые индексы, номера телефонов и артикулы должны оставаться текстом, иначе ноль пропадёт. При включённой опции «Преобразовывать числа» инструмент преобразует 10001, но оставляет 02134 строкой. По умолчанию опция выключена. Она преобразует только значения с точкой как десятичным разделителем, поэтому 1,5 в файле с точкой с запятой остаётся как есть.
Длинные идентификаторы тоже требуют внимания. JavaScript, на котором работает большая часть JSON в браузере, хранит числа как 64-битные числа с плавающей точкой. Целые числа точно представляются только до 9 007 199 254 740 991, то есть два в степени 53 минус 1. Число 12345678901234567890 превращается в 12345678901234567000, когда его читает программа на JavaScript. Инструмент записывает цифры так, как они введены, но программа, которая разбирает JSON в JavaScript, округлит их. Храните идентификаторы как строки. Форматировщик JSON тоже сохраняет такие числа точно, как введены, и сообщает, сколько их сохранено.
Вложенный JSON и возврат в CSV
CSV плоский, а JSON может быть вложенным. При преобразовании JSON в CSV создаётся один столбец для каждого ключа во всех объектах, в порядке первого появления ключа. Вложенный объект или список попадает в ячейку как текст JSON, null становится пустой ячейкой, а true и false записываются словами. Строки соединяются через CRLF, а поле заключается в кавычки, только если содержит разделитель, кавычку, перенос строки или пробелы по краям.
Ввод, который начинается с [ или {, читается как JSON. Кнопка-переключатель меняет направление и подписана «CSV → JSON» или «JSON → CSV». В направлении JSON → CSV в параметрах вывода появляются меню «Разделитель» и опция «Для Excel».
Обратное преобразование теряет информацию. И null, и пустая строка становятся пустой ячейкой, а вложенность не восстанавливается, поэтому, если нужна структура, сохраните исходный JSON.
Excel, UTF-8 и метка порядка байтов
Файл CSV — это байты, и программа должна знать кодировку. UTF-8 хранит буквы с диакритическими знаками и алфавиты других языков. Метка порядка байтов (BOM) — три байта в начале файла — указывает, что файл в UTF-8. Без неё некоторые табличные редакторы читают файл в локальной кодовой странице, и буквы с диакритикой превращаются в непонятные символы. Табличные редакторы также часто превращают 02134 в 2134 при открытии CSV.
Опция «Для Excel» добавляет метку порядка байтов только в скачиваемый CSV, но не в скопированный текст, и только в направлении JSON → CSV. Инструмент удаляет метку порядка байтов из входных данных, поэтому файл, который её уже содержит, конвертируется без ошибок.
Особые случаи
- Строки разной длины. Если включён заголовок, короткая строка дополняется пустыми значениями, а длинная сохраняет лишние значения как column_N. В результате указывается, сколько строк отличаются от заголовка.
- Повторяющиеся или пустые заголовки. Повторяющееся имя получает суффикс _2, _3 и так далее, а пустое имя становится column_N. Оба изменения не дают двум ключам перезаписать друг друга.
- Typographic-кавычки. Фигурные кавычки из текстового редактора не являются кавычками CSV, поэтому поле вида «Smith, Ann» разрывается по запятой. Сначала замените их: исправьте вставленный текст или действуйте по инструкции из руководства о фигурных кавычках.
- Переносы строк внутри кавычек. Поле, занимающее две строки, — это одна запись, но удаление повторяющихся строк делит входные данные по каждому переносу строки, поэтому две части будут восприняты как отдельные строки. Преобразуйте в JSON и сравните объекты или проверьте вручную. Инструмент остаётся полезным для списков с одним значением в строке.
- Большие файлы. В окне результата показываются первые 100 000 символов, но кнопка «Копировать» и скачивание включают весь результат.
- Некорректный JSON. Конвертер указывает строку и столбец ошибки, а под ошибочным символом выводит курсор. Форматировщик JSON объясняет распространённые опечатки, а руководство по ошибкам JSON рассматривает их подробнее.
Лишние пробелы вокруг полей, пустые строки в середине файла и непоследовательное использование кавычек вызывают большинство проблем с CSV ещё до того, как начинает играть роль разделитель. Сначала очистите CSV, а затем конвертируйте.
Переведено с помощью ИИ с Английский оригинал.
Комментарии
Комментариев пока нет. Будьте первым.


