Вчера полдня пытался сделать загрузку с помощью регулярных выражений , никак не получалось - то одно поле не проскакивает, то другое.
А утром решил написать функцию для разбора строки csv самостоятельно.
Берите, пользуйтесь.
Функция Разложить_CSV(Стрк,Разд)
м = Новый Массив;
вКавычках = Ложь;
Если Лев(Стрк,1)=Символы.ПС Тогда
Стрк = Сред(Стрк,2);
КонецЕсли;
инд = 1;
длСтрк = СтрДлина(Стрк);
элСтрк = "";
Пока инд<=длСтрк Цикл
Симв = Сред(Стрк,инд,1);
Если Симв="""" Тогда // кавычка
Если вКавычках Тогда
Если инд<длСтрк Тогда
СледСимв = Сред(Стрк,инд+1,1);
Иначе // последняя позиция и это закрывающая кавычка, значит это конец строки
м.Добавить(элСтрк);
Возврат м;
КонецЕсли;
Если СледСимв = Разд Тогда // закрывающая кавычка
вКавычках = Ложь;
инд = инд+1;
Продолжить; // на разделителе добавим строку в кавычках в массив
ИначеЕсли СледСимв="""" Тогда // два символа кавычек подряд внутри это один символ
элСтрк = элСтрк+"""";
инд=инд+2;
Продолжить;
КонецЕсли;
Иначе // начало строки в кавычках
вКавычках = Истина;
инд=инд+1;
Продолжить;
КонецЕсли;
ИначеЕсли Симв=Разд И вКавычках=Ложь Тогда // очередную строку добавляем в массив
м.Добавить(элСтрк);
элСтрк="";
Иначе // все прочие символы просто добавляем в строку
элСтрк = элСтрк+Симв;
КонецЕсли;
инд=инд+1;
КонецЦикла;
Если элСтрк="" Тогда
Если Прав(Стрк,1)=Разд Тогда
м.Добавить("");
КонецЕсли;
Иначе
м.Добавить(элСтрк);
КонецЕсли;
Возврат м;
КонецФункции
Не забудьте при открытии файла на чтение определить разделителем только CR, иначе по-умолчанию LF тоже будет переводом строки.
Вот как-то так :
чт = Новый ЧтениеТекста(СокрЛП(ФайлЗагрузки), КодировкаТекста.ANSI, Символы.ВК, Символы.ПС);
Стрк = чт.ПрочитатьСтроку();
Пока Стрк <> Неопределено Цикл // строки читаются до символа CR
МассивЗнч = Разложить_CSV(Стрк,";");
// ... делаем что нам надо с МассивЗнч
Стрк = чт.ПрочитатьСтроку();
КонецЦикла;
Работает, конечно, помедленней чем с RegExp'ами, зато париться не надо.
Всех благ !
Как корректно загрузить в 1С сложный файл в формате CSV
Когда внутри полей есть перевод строки LF и разделитель
1С