Клиент прислал мне экспорт клиента на 12 000 строк для загрузки в промежуточную базу данных. Я переделал его, импортировал и отправил. Два дня спустя их руководитель OPS спросил, почему несколько сотен клиентов в Нью-Джерси имеют четырехзначные почтовые индексы.
07102 стал 7102.Каждый зип, начинающийся с нуля, по всему файлу, тихо ампутирован. Не по ошибке - по функции. Вывод типа рассматривался 07102, увидел что-то, что соответствовало «числу», и услужливо преобразовало его в единицу. Ведущие нули — это не то, что есть в числах.
я построил CSV в JSON конвертер на Toolz.dev, и он это делает тоже. Я покажу вам, где именно, потому что конвертер, который молча меняет ваши данные, более опасен, чем тот, который просто не выходит из строя.
TL;DR: выше CSV в JSON конвертер Превращает CSV в массив объектов, используя первую строку в качестве ключей, полностью работающую в вашем браузере. ИТ Всегда выводит типы и вы можете 't выключить это в пользовательском интерфейсе - что означает
07102→7102,1250.50→1250.5, пустые ячейки →null, иtrue/false→ Булевы. Большие целые числа после 2⁵³ Stay Strings, что сохраняет ваши идентификаторы Twitter. только запятые в интерфейсе, так что полуколонные CSV от European Excel won't parse.Duplicate заголовки являются жесткой ошибкой, а не молчаливой перезаписью - что one's подлинное улучшение по сравнению с большинством парсеров. проверьте вывод перед импортом, и используйте Форматтер JSON Чтобы глазом его на глаза.
Что на самом деле делает этот конвертер для ваших данных?
Каждое значение в CSV — это текст. 29 это персонажи 2 а 9, йо- JSON имеет реальные типы, поэтому конвертер должен решить: 29 Число 29 или струна "29"? В целом нет правильного ответа, и каждый CSV-парсер догадывается.
Этот догадывается. всегда. Вот полный набор правил, прямо из кода и проверенный запуском:
| значение CSV | json вывод | тип |
|---|---|---|
29 |
29 |
номер |
07102 |
7102 |
число - ноль ушел |
1250.50 |
1250.5 |
число - цент ушло |
true / TRUE |
true |
булевский |
null / NIL |
null |
несущественный |
| (пустая ячейка) | null |
несущественный |
9007199254740993 |
"9007199254740993" |
струна |
1e3 |
1000 |
номер |
+5 |
"+5" |
струна |
.5 |
".5" |
струна |
NO |
"NO" |
струна |
+8801712345678 |
"+8801712345678" |
струна |
2024-01-05 |
"2024-01-05" |
струна |
Некоторые из них заслуживают более внимательного изучения, потому что узор не очевиден.
Регулярное выражение чисел строг, и это несущая. это соответствует ^-?\d+$ И ничего больше. Вот почему +5 а .5 выжить как строки - нет ведущего плюса, нет голой десятичной точки. Это и #39;s также почему +8801712345678- телефон Бангладеш, и я тестирую на своем - проходит неповрежденным. Раздень это + И вы потеряете его для числового преобразования. Таким образом, строгость регулярного выражения случайно защищает номера телефонов и только номера телефонов, которые хранили код страны плюс.
Большие целые числа обрабатываются правильно, что меня удивило. Все, что находится вне безопасного диапазона целых чисел JavaScript (±2⁵³−1), а не преобразуется и исправляется. Снежинки, идентификаторы Twitter и 19-значные ключи базы данных выживают. Большинство наивных преобразователей звонят parseInt И передать тебе 9007199254740992 Где у вас было ...93, йо- Этот проверяет границу первой.
NO остается струной- который тихо уклоняется от проблемы Норвегии, которая ест файлы YAML. Другой формат, другой парсер, но стоит отметить: код страны NO Это переворот к тому, как синтаксический анализатор конфигов, и вот он безопасен.
Пустые означает null, а не пустую строку. И вот небольшая ошибка документации, которую я нашел, написав это: собственная "как это работает" панель "Пустые значения сохраняются как пустые строки в выводе JSON. они нет. inferType('') обратный null, йо- Текст пользовательского интерфейса неверен, код — это то, что поставляется. Я исправляю копию.
Почему 07102 становится 7102, и что мне с этим делать?
Потому что почтовый индекс — это не номер, а компьютер не может сказать.
07102 Соответствует "цифрам, необязательно отрицательно" идеально. parseInt("07102", 10) есть 7102. Ведущий ноль нес в себе значение - это был данные - и числа не имеют возможности удерживать его То же самое происходит с
- почтовые индексы,
07102,01950, что-нибудь в Новой Англии или Нью-Джерси - СУКУ,
00451 - Телефонные номера без плюса,
0171... - Банковские/маршрутные коды, Идентификаторы сотрудников, Любой мягкий идентификатор
- деньги,
1250.50→1250.5, и2100.00→2100
С последним стоит сидеть. 1250.50 а 1250.5 являются одним и тем же номером и другой строкой. Если вы визуализируете валюту ниже по течению, $1250.5 собирается появиться где-то в пользовательском интерфейсе, и кто-то подаст ошибку, которая занимает час, чтобы проследить до конвертации CSV тремя неделями ранее. (Настоящий урок заключается в том, чтобы хранить деньги в виде целых центов или десятичной строки, а не в виде плавающей запятой, но это ' сражается за другую статью.)
Прямо сейчас в этом инструменте есть Нет переключателя, чтобы отключить вывод. Основная функция принимает inferTypes Опция и пользовательский интерфейс никогда не передают его, поэтому он включен, постоянно, по умолчанию. Это пробел, и это верхний пункт в моем списке для этого инструмента.
Пока не отправится, ваши варианты:
- Посмотрите на выход. Серьезно - вот почему инструмент показывает JSON в панели вместо того, чтобы просто загрузить его. сканируйте столбцы вашего ID. Это занимает десять секунд и это's как я должен был поймать почтовые индексы.
- цитата из цитат. Цитирование в CSV won't help - парсер стриптизует цитаты и к тому же делает выводы, так что
"07102"все равно становится7102, йо- Вместо этого сделайте значение нечислового в источнике: экспортируйте какZIP-07102, или добавьте столбец префикса в таблицу. - пост-процесс. Конвертируйте, затем исправьте известные вам столбцы:
data.forEach(r => r.zip = String(r.zip).padStart(5, '0')), йо- Некрасиво, но честно и проверяемо. - Используйте реальный синтаксический анализатор для реальных конвейеров. для всего запланированного или автоматического,
csv-parseили папа разбор в узле сcast: falseСделаю это правильно. Инструмент браузера предназначен для одноразового.
Что правильно получает парсер?
Я & #39; были жесткими в этом, так что вот и #39;s другая половина - и кое-что из этого действительно лучше, чем то, что вы & #39; найдет в другом месте.
Дубликаты заголовков — сложная ошибка. кормить его a,b,a И отказывается: Duplicate headers found: a. Большинство парсеров молча позволяют последнему столбцу выиграть, поэтому столбец данных исчезает без слова. Громко здесь не удался правильный вызов - в объекте JSON не может быть двух ключей с одинаковым именем, и притворство, что в противном случае потеряет данные.
Цитируемые поля обрабатываются правильно, пер RFC 4180. Внутренние кавычки запятых остаются на месте; "" становится буквальным ", йо- Образцы данных поставляются с "Mike, Jr." конкретно, чтобы доказать это.
Новые строки внутри цитируемых полей работают. Здесь обычно умирает ручное расщепление CSV - кто-то расщепляется \n и многострочное поле адреса детонирует весь файл. Разветвитель строк отслеживает цитирование состояния символа по символу, поэтому "line1\nline2" остается в одном поле.
Пустые строки пропущены, поэтому очередные строки и пустые строки Excel в конце не создают фантомных объектов.
Рваные ряды не падают. Слишком мало полей и недостающие клавиши возвращаются null; слишком много, и дополнительные материалы, превышающие количество заголовков, отбрасываются молча. (Последняя часть I'd вызывает спорный, а не правильный - предупреждение было бы лучше, чем тихий сброс.)
Одно RFC-отклонение, чтобы узнать о: Значения обрезаются, в том числе внутри котировок. RFC 4180 §2.4 говорит, что пространства являются частью поля и не должны игнорироваться, поэтому " John " должен быть " John ", йо- Этот инструмент дает вам "John". Это's сознательное удобство - 99% времени отставание пробелов в CSV - это несчастный случай, который вы хотите, чтобы исчезнуть - но если вы' это данные об обходе, когда заполнение важно, it's потерянный шаг, и спецификация не на моей стороне.
Почему мой CSV-разработчик не будет?
Потому что интерфейс только запятые, и это ловит каждый европейский экспорт.
excel в локали, которая использует запятую, так как десятичный разделитель записывает CSV с точка с запятой как разделитель поля. Вполне действителен, крайне распространен, и этот инструмент не будет его анализировать. паста a;b и вы получаете один ключ буквально названный a;b со значением "1;2". Это ошибка 't - она просто создает один бесполезный столбец, что хуже, чем ошибка.
Функция синтаксического анализа принимает delimiter опция. Пользовательский интерфейс никогда не раскрывает его. Тот же класс GAP, что и переключатель вывода.
Обходные пути:
- находка и замена
;→,в текстовом редакторе сначала - безопасно только Если ни одно поле не содержит запятую внутри кавычек. - относительно -Экспорт из Excel с "CSV UTF-8 (запятая с ограничением)".
- использовать CSV-просмотр вместо этого - он выполняет обнаружение разделителей, оценивая согласованность подсчета столбцов по разделителям кандидатов, поэтому он будет читать ваш файл с точкой с запятой. Он выиграл 't конвертируется в JSON, но it' покажет вам, что у вас есть.
Та же проблема есть. Так же и с разграничением трубы.
Как преобразовать CSV в JSON на Toolz.dev?
Шаг 1: Откройте конвертер
ПЕРЕЙТИ К CSV в JSON конвертер, йо- Образцы данных загружаются и уже преобразуются, поэтому вы можете сразу увидеть форму.
Шаг 2: Вставьте CSV
Вставьте в левую панель. там Нет загрузки файла- it's текстовая область, так что откройте свою .csv в текстовом редакторе и скопируйте его через. За несколько тысяч строк это нормально. Для экспорта на 200 МБ используйте реальный синтаксический анализатор.
Ваша первая строка должна быть заголовком, и вам нужна хотя бы одна строка данных. Одна строка возвращается CSV must have at least a header row and one data row, йо-
Шаг 3: конвертировать
бить конвертировать в json. Вы получаете массив объектов, по одному в строке, ключи из вашего заголовка, с отступом в два пробела. счетчик строк отображается над выводом - сверьте его с тем, что вы ожидали, поскольку it's - самый дешевый тест на вменяемость.
Шаг 4: Прочтите вывод, прежде чем доверять ему
Шаг все пропускают, и я пропустил один раз. Посмотрите на свои колонки ID. Посмотрите на свои колонки денег. Если почтовый индекс отображается в JSON не погашенным, теперь это число.
Шаг 5: Скопируйте или скачайте
писать Для буфера обмена, Скачать JSON для data.json пилка
Когда мне не следует использовать конвертер браузера?
Честно говорить о границе:
| положение | обычай |
|---|---|
| Одноразовое, несколько тысяч строк | CSV в JSON |
| Конфиденциальные данные, которые вы не можете загрузить | Это - он никогда не покидает ваш браузер |
| что-либо запланированное или автоматическое | csv-parse / Папа в узле |
| Точка с запятой или вкладка | CSV-просмотр, или исправить разделитель |
| Почтовые индексы, SKU, мягкие идентификаторы | что-либо с cast: false |
| Вложенный вывод из пунктирных заголовков | Сценарий - при этом получаются только плоские объекты |
| 100к+ строк | Потоковое синтаксическое анализатор; браузер держит все это в памяти |
| Идти в другую сторону | json в CSV |
Этот «вложенный вывод» стоит прямо сказать, поскольку более старые версии этого руководства утверждали иначе: заголовки, такие как user.name а address.city вести себя не стать вложенными объектами. Вы получаете плоский объект с ключом, буквально названным "user.name". There's нет расширения точечных обозначений, нет преобразования заголовка, нет преобразования camelCase. Плоские объекты, ключи точно такие, как напечатано в строке заголовка - пробелы, хэши и все такое. Заголовок Order # дает вам ключ от "Order #", который является юридической JSON и неудобным javascript (row["Order #"]).
Причина, по которой можно обратиться к этому инструменту, та же причина, что и к остальному сайту: ваши данные не 't идут куда угодно. если вы 'переконвертируете экспорт клиента с настоящими именами и электронными письмами в нем, это 's не мелочь - вставить его в конвертер на стороне сервера означает передать третьей стороне файл персональных данных, который является разговором с вашим DPO вы 'd скорее не иметь. Здесь синтаксический анализ выполняется на вашей вкладке. Выключите свой Wi-Fi, и он все равно работает.
Часто задаваемые вопросы
Почему мой почтовый индекс потерял ведущий ноль?
Потому что вывод типа преобразован в число, а числа не могут хранить ведущие нули. 07102 соответствует шаблону "только цифры", так что он становится 7102. Это влияет на почтовые индексы, мягкие SKU, идентификаторы сотрудников и любой идентификатор, который оказывается цифрами. Цитируя это в CSV won't help - кавычки удаляются перед запуском вывода. проверьте столбцы идентификатора на выходе или добавьте значения в исходный код, чтобы сделать их нечисловыми.
Могу ли я отключить автоматическое преобразование типов?
Не в интерфейсе. Основная функция поддерживает inferTypes вариант, но пользовательский интерфейс не выставляет его, поэтому вывод всегда включен. Если вам нужны необработанные строки, используйте парсер библиотеки, например Papa Parse или csv-parse При отключении приведения или исправлении затронутых столбцов после преобразования.
Поддерживает ли он файлы с запятой или вкладками с разделителями Tab?
Нет - интерфейс только запятый. файл с точкой с запятой анализируется в один бессмысленный столбец, а не ошибается, поэтому следите за этим. Сначала замените точки с запятой запятыми (безопасно только в том случае, если ни одно поле с кавычками не содержит запятую), реэкспортируйте из Excel как разделенные запятыми или используйте средство просмотра CSV, которое автоматически обнаруживает разделители.
Что происходит с пустыми ячейками?
они становятся null, а не пустые строки. заметьте, что инструмент's владеет & quot;How it works& quot; панель в настоящее время говорит обратное - текст панели неправильный и код правильный. ячейки, содержащие буквальный текст null или nil также стать null, йо-
Могу ли я преобразовать CSV без строки заголовка?
нет , йо- Первая строка всегда рассматривается как заголовок, а файл с одной строкой возвращает ошибку, говорящую, что ему нужен заголовок плюс хотя бы одна строка данных. Если ваши данные не имеют заголовка, добавьте его в текстовый редактор перед вставкой.
Обрабатывает ли он запятые и разрывы строк внутри кавычки в полях?
Да, оба. Парсер отслеживает цитирование состояния символа по символу, поэтому поле, похожее на "Mike, Jr." Сохраняет свою запятую, а поле в кавычках, содержащее новую строку, остается одним значением вместо разделения строки. избежали двойных кавычек ("") стать единственной буквальной цитатой, согласно RFC 4180.
Что происходит с именами дублирующихся столбцов?
Он отказывается конвертировать и сообщает, какой заголовок дублируется. That's преднамеренно - объект JSON может't иметь две одинаковые клавиши, поэтому альтернативой является молчаливое опускание столбца. Многие парсеры делают именно это; переименовать столбцы и преобразовать снова.
Есть ли предел строки?
Нет принудительного ограничения, но все работает в памяти вашего браузера: текст CSV, синтаксический массив и отформатированная строка JSON все существуют одновременно. Несколько тысяч рядов удобны, а шестизначные подсчеты заставят вкладку. Для больших файлов используйте вместо этого синтаксический анализатор потоковой передачи в узле.
Мои данные куда-нибудь загружены?
Нет. Анализ происходит в вашем браузере, и ваш CSV никогда не передается, что делает его безопасным для экспорта клиентов и других данных, которые вы могли бы 't законно вставить в инструмент на стороне сервера. Проверьте это простым способом - откройте DevTools, посмотрите вкладку "Сеть" во время преобразования или просто отключите Wi-Fi и убедитесь, что он все еще работает.
короткая версия
CSV в JSON выглядит как самое скучное преобразование в вычислительной технике, и это не так, потому что в тот момент, когда синтаксический анализатор решает, какие у вас строки невзрач, это может быть неправильным способом, чтобы не объявлять себя. Никакой ошибки, никаких предупреждений, только четырехзначные почтовые индексы, которые появляются через два дня.
Итак: перевести, тогда Читать вывод, йо- Проверьте столбцы, которые являются идентификаторами, притворяющимися числами. Если они вышли не по кавычкам, вы что-то потеряли. Эта привычка стоит десять секунд и сэкономила бы мне смущающее электронное письмо.
выше CSV в JSON конвертер хорош в разовой работе - цитируемые поля, встроенные новые строки, большие целые идентификаторы и громкие сбои в дублирующих заголовках, и все это без выхода ваших данных из браузера. It's только запятая, он всегда делает выводы о типах и создает плоские объекты. Теперь вы знаете все три, прежде чем они кусаются.
Идти в другом направлении: json в CSV, йо- Для проверки сначала беспорядочного CSV: CSV-просмотр, йо- Для проверки вывода: Форматтер JSON, йо- И если ваши данные направляются для файла конфигурации, json в yaml, йо- Более широкая экскурсия в Руководство по инструментам JSON и тот Руководство по инструментам кодирования, йо-



