Русский

Данные и таблицы · CSV Очиститель

Как парсер CSV обрабатывает кавычки, вставленные запятые и символы новой строки в полях

· Как это работает

csv анализ форматы данных

Путь к состоянию синтаксического анализатора, сохраняющий запятые в кавычках, двойные кавычки и встроенные разрывы строк внутри полей.
Оригинальная векторная иллюстрация ToolAcre

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

Поле адреса с запятой сдвигало каждый столбец вправо — почему наивное разбиение — это не парсинг

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

ToolAcre доказывает это с помощью тестов, а не предполагает, что CSV — это простой текст. Файл с точкой с запятой, содержащий запятые внутри примечаний в кавычках, по-прежнему определяется как разделенный точкой с запятой, поскольку каждый кандидат анализируется на строки перед оценкой его прямоугольной формы. Простое количество пунктуации никогда не определяет диалект.

Правила кавычек — поля, содержащие разделитель, кавычки или символы новой строки, заключаются в двойные кавычки, а внутренние кавычки удваиваются.

Поле, содержащее выбранный разделитель, двойную кавычку, перевод строки или возврат каретки, цитируется во время сериализации. Буквальная двойная кавычка внутри кавычекого поля представлена ​​двумя соседними кавычками. При анализе эта пара добавляет в ячейку одну кавычку и не закрывает поле.

Кавычки открывают цитируемое состояние только тогда, когда они появляются в начале пустого поля. В значении без кавычек, таком как канал 12", кавычка остается буквальными данными. Этот выбор реализации проверяется и не позволяет метке измерения в середине текста поглощать последующие столбцы.

Парсер как конечный автомат: внутренние кавычки и внешние кавычки, и как один символ за раз решает, где заканчивается поле.

Основной цикл отслеживает текущее поле, текущую строку и состояние `inQuotes`. Вне кавычек разделитель помещает поле, а CR, LF или CRLF помещает строку. Внутри кавычек добавляется каждый символ, кроме кавычки, которая либо образует экранированную пару, либо выходит из состояния кавычек.

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

Встроенные символы новой строки — почему строка может занимать несколько строк и почему инструменты на основе строк, такие как grep или записи неправильных подсчетов wc

Поле в кавычках может содержать LF, CRLF или одиночный CR, и эти символы остаются внутри значения. Следовательно, одна логическая запись может занимать несколько строк отображения в текстовом редакторе. Подсчет физических строк с помощью построчно-ориентированной команды не обязательно учитывает строки данных.

После закрывающей кавычки следующий разделитель или окончание записи возобновляет структурное значение. Тесты ToolAcre подтверждают как встроенный LF, так и встроенный CRLF, а затем проверяют, что была создана только одна строка. Такое поведение не выводится из метки RFC; оно осуществляется непосредственно поставленным конечным автоматом.

Нарушенные кавычки — несбалансированные кавычки, поглощающие остальную часть файла, и то, как инструмент восстановления последовательно повторно цитирует поля.

В общих чертах обещано исправление цитирования, но незакрытая цитата по своей сути двусмысленна. ToolAcre сообщает `UNCLOSED_QUOTE` для строки, где начинается состояние цитирования, и затем считывает все в одно поле. Он не изобретает закрытие позиции и не цитирует намеченные записи.

Эта консервативная ошибка сохраняет использованный текст для проверки и позволяет избежать притворства, что известно, была ли более поздняя кавычка или новая строка задуманы как данные. Исправьте исходный код или повторно создайте экспорт, а затем перезагрузите его. Сериализация может нормализовать успешно проанализированную таблицу; он не может восстановить границы строк, которые неверный источник сделал непознаваемым.

О нарушенном цитировании сообщается, но оно не устраняется; незакрытое поле поглощает оставшийся текст

Используйте `name,note` в качестве заголовка, затем одну строку с Ada и примечанием, содержащим запятую и разрыв строки, и еще одну строку с примечанием `She said "hi"`. В исходном коде CSV заключите длинное примечание в кавычки и напишите внутреннюю кавычку как `""hi""`. Анализатор возвращает две строки данных и сохраняет оба специальных символа.

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

Чего это не касается — диалекты, использующие обратную косую черту, и эвристику для угадывания намерения, когда цитирование действительно неоднозначно.

Диалекты escape-обратной косой черты находятся за пределами синтаксического анализатора. Обратная косая черта перед кавычкой не имеет здесь особого машинного значения; он остается текстом, а цитата интерпретируется по правилам двойных кавычек. Инструмент также отказывается угадывать намерения, если начальная котировка остается непревзойденной.

Эти границы имеют значение при импорте дампа базы данных, настроенного для другого соглашения об экранировании. Перед загрузкой определите диалект производителя или экспортируйте его с цитированием в стиле RFC. Анализатор, который молча распознает несколько несовместимых управляющих правил, может превратить буквальную обратную косую черту в управляющий синтаксис и скрыть несоответствие.

Уважайте кавычки и строки остаются нетронутыми — как ToolAcre CSV очиститель цитирования создает файл, который стандартные парсеры читают правильно

Соблюдение состояния кавычек сохраняет разделители и окончания записей внутри ячеек, которым они принадлежат. ToolAcre также обрабатывает три формы окончания строки, удаляет начальный UTF-8 BOM и сообщает о несоответствии ширины строки. Такое поведение является независимыми частями одного структурного чтения, а не набором трюков поиска и замены.

После правильного анализа сериализация удваивает встроенные кавычки и цитирует любое поле, требующее защиты, с выводом CRLF по умолчанию. После недействительной незакрытой цитаты остановитесь и исправьте исходные данные. Инструмент может стандартизировать известные клетки; он не претендует на восстановление непознаваемой таблицы.