Как правильно импортировать данные из CSV, если внутри полей содержатся разделители?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При загрузке данных из текстовых файлов формата CSV часто возникает проблема: если само значение поля содержит символ-разделитель (обычно запятую), стандартная функция СтрРазделить некорректно разбивает строку. Рассмотрим, как эффективно решить эту задачу средствами 1С, чтобы данные не терялись и не смещались при чтении.

Анализ проблемы

Стандартный подход, использующий метод СтрРазделить(ТекСтрока, ","), работает только в том случае, если разделители встречаются исключительно между полями. Однако, если в ваших данных встречаются записи вида "01029,123456", "Значение с запятой", метод просто разрежет данные по запятой внутри кавычек, что приведет к созданию лишних элементов массива и искажению структуры данных.

Решение через постобработку массива

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

  1. Разбиваем исходную строку на массив с помощью СтрРазделить.
  2. Проходим циклом по полученному массиву, проверяя каждый элемент на наличие открытых кавычек.
  3. Если количество кавычек в элементе нечетное, это означает, что запятая попала внутрь блока, и нам нужно объединить текущий элемент со следующим.

Посмотрим на пример реализации такого подхода:


МассивСлов = СтрРазделить(ТекСтрока, ",");
Инд = 0;
Пока Инд < МассивСлов.ВГраница Цикл
    Если СтрЧислоВхождений(МассивСлов[Инд], """") % 2 <> 0 Тогда
        МассивСлов[Инд] = МассивСлов[Инд] + "," + МассивСлов[Инд + 1];
        МассивСлов.Удалить(Инд + 1);
    Иначе
        Инд = Инд + 1;
    КонецЕсли;
КонецЦикла;

Метод обработки через кавычки

Если вы хотите избежать сложной логики со склейкой, можно применить подход «нарезки» строки по кавычкам. В этом случае мы рассматриваем элементы массива, расположенные между кавычками, как неделимые объекты, а четные/нечетные элементы — как данные или разделители.

Рассмотрим алгоритм действий:

Рекомендации по реализации

Чтобы ваша обработка работала надежно, важно учитывать следующие нюансы:

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

← На главную