При загрузке данных из текстовых файлов формата CSV часто возникает проблема: если само значение поля содержит символ-разделитель (обычно запятую), стандартная функция СтрРазделить некорректно разбивает строку. Рассмотрим, как эффективно решить эту задачу средствами 1С, чтобы данные не терялись и не смещались при чтении.
Стандартный подход, использующий метод СтрРазделить(ТекСтрока, ","), работает только в том случае, если разделители встречаются исключительно между полями. Однако, если в ваших данных встречаются записи вида "01029,123456", "Значение с запятой", метод просто разрежет данные по запятой внутри кавычек, что приведет к созданию лишних элементов массива и искажению структуры данных.
Одним из эффективных способов является предварительное разделение строки, за которым следует логическая склейка элементов, ошибочно разделенных запятой. Разберем этот алгоритм по шагам:
СтрРазделить.Посмотрим на пример реализации такого подхода:
МассивСлов = СтрРазделить(ТекСтрока, ",");
Инд = 0;
Пока Инд < МассивСлов.ВГраница Цикл
Если СтрЧислоВхождений(МассивСлов[Инд], """") % 2 <> 0 Тогда
МассивСлов[Инд] = МассивСлов[Инд] + "," + МассивСлов[Инд + 1];
МассивСлов.Удалить(Инд + 1);
Иначе
Инд = Инд + 1;
КонецЕсли;
КонецЦикла;
Если вы хотите избежать сложной логики со склейкой, можно применить подход «нарезки» строки по кавычкам. В этом случае мы рассматриваем элементы массива, расположенные между кавычками, как неделимые объекты, а четные/нечетные элементы — как данные или разделители.
Рассмотрим алгоритм действий:
СтрРазделить(Строка, """", Истина) для разделения по кавычкам.Чтобы ваша обработка работала надежно, важно учитывать следующие нюансы:
"". При посимвольном парсинге это нужно учитывать, чтобы не закрыть «флаг» активности поля раньше времени.ТекстовыйДокумент или ЧтениеТекста для последовательного считывания строк, чтобы не перегружать оперативную память.В завершение, если вы имеете возможность влиять на источник данных, всегда лучше выбирать формат обмена с менее «конфликтными» разделителями, например, Табуляция или использование форматов JSON или XML, где структура данных описывается явно и не зависит от содержимого полей.