Как корректно загрузить в 1С сложный файл в формате CSV

Когда внутри полей есть перевод строки LF и разделитель

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

А утром решил написать функцию для разбора строки csv самостоятельно.

Берите, пользуйтесь.

                
Функция Разложить_CSV(Стрк,Разд) м = Новый Массив; вКавычках = Ложь; Если Лев(Стрк,1)=Символы.ПС Тогда Стрк = Сред(Стрк,2); КонецЕсли; инд = 1; длСтрк = СтрДлина(Стрк); элСтрк = ""; Пока инд<=длСтрк Цикл Симв = Сред(Стрк,инд,1); Если Симв="""" Тогда // кавычка Если вКавычках Тогда Если инд<длСтрк Тогда СледСимв = Сред(Стрк,инд+1,1); Иначе // последняя позиция и это закрывающая кавычка, значит это конец строки м.Добавить(элСтрк); Возврат м; КонецЕсли; Если СледСимв = Разд Тогда // закрывающая кавычка вКавычках = Ложь; инд = инд+1; Продолжить; // на разделителе добавим строку в кавычках в массив ИначеЕсли СледСимв="""" Тогда // два символа кавычек подряд внутри это один символ элСтрк = элСтрк+""""; инд=инд+2; Продолжить; КонецЕсли; Иначе // начало строки в кавычках вКавычках = Истина; инд=инд+1; Продолжить; КонецЕсли; ИначеЕсли Симв=Разд И вКавычках=Ложь Тогда // очередную строку добавляем в массив м.Добавить(элСтрк); элСтрк=""; Иначе // все прочие символы просто добавляем в строку элСтрк = элСтрк+Симв; КонецЕсли; инд=инд+1; КонецЦикла; Если элСтрк="" Тогда Если Прав(Стрк,1)=Разд Тогда м.Добавить(""); КонецЕсли; Иначе м.Добавить(элСтрк); КонецЕсли; Возврат м; КонецФункции

Не забудьте при открытии файла на чтение определить разделителем только CR, иначе по-умолчанию LF тоже будет переводом строки. 

Вот как-то так : 

                
чт = Новый ЧтениеТекста(СокрЛП(ФайлЗагрузки), КодировкаТекста.ANSI, Символы.ВК, Символы.ПС); Стрк = чт.ПрочитатьСтроку(); Пока Стрк <> Неопределено Цикл // строки читаются до символа CR МассивЗнч = Разложить_CSV(Стрк,";"); // ... делаем что нам надо с МассивЗнч Стрк = чт.ПрочитатьСтроку(); КонецЦикла;

Работает, конечно, помедленней чем с RegExp'ами, зато париться не надо.

Всех благ !