Универсальная загрузка файла *.CSV в ТЗ типовым решением (8.3.6+)


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

Бывает так, что средствами ADO не воспользоватся или выдается не тот результат которого вы ждали, тогда на смену им приходят простые типовые решения. Платформа не ниже 8.3.6.

Простая функция чтения файла CSV и запись результата в ТЗ, да она медленея чем загрузка средствами ADO примерно 30%, но при прямых руках дает более качественный результат.

Функция ЗагрузитьИзФайлаCSV(ПутьКФайлу, ФайлCSV, Разделитель = ";", ОграничительСтроки = "", КодировкаФайла = "" , НачСтрока = 1, ЗагрузитьСтрок = 0, КоличествоКолонок = 10,ТабличныйДокумент = Неопределено) Экспорт

Если ТабличныйДокумент = Неопределено Тогда ТабличныйДокумент = Новый ТекстовыйДокумент; КонецЕсли;

Попытка
ТабличныйДокумент.Прочитать(ПутьКФайлу+ФайлCSV, ?(КодировкаФайла = "",КодировкаТекста.ANSI,КодировкаФайла));
Исключение
Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат Новый ТаблицаЗначений;
КонецПопытки;

КолвоСтрокФайла = ТабличныйДокумент.КоличествоСтрок();
КонечнаяКолонка = КоличествоКолонок;

Если КолвоСтрокФайла = 0 Тогда ТабличныйДокумент = Неопределено; Возврат Новый ТаблицаЗначений;   КонецЕсли;

Если НачСтрока > КолвоСтрокФайла Тогда ТабличныйДокумент = Неопределено;  Возврат Новый ТаблицаЗначений;  КонецЕсли;

ТабЗн=Новый ТаблицаЗначений;
ТипЯчейки  =  Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(128));

Для ит = 1 ПО КонечнаяКолонка Цикл
ТабЗн.Колонки.Добавить("F" + ит, ТипЯчейки);
КонецЦикла;

КонСтрока = НачСтрока + ЗагрузитьСтрок;
КонСтрока = ?(КонСтрока = 1, КолвоСтрокФайла, КонСтрока);

Для нСтрока = НачСтрока ПО КонСтрока Цикл
Если нСтрока > КолвоСтрокФайла Тогда Прервать; КонецЕсли;
НоваяСтрокаТФ = ТабЗн.Добавить();
СтрокаДокумента=СтрЗаменить(ТабличныйДокумент.ПолучитьСтроку(нСтрока),ОграничительСтроки+?(Разделитель="Таб",Символы.Таб,Разделитель),";");
ЗначениеСтроки = СтрРазделить(СтрокаДокумента,";");
КоличествоПозиций = ЗначениеСтроки.Количество();
Для нКолонка=1 ПО ?(КоличествоПозиций<КонечнаяКолонка,КоличествоПозиций,КонечнаяКолонка) Цикл
НоваяСтрокаТФ["F" + нКолонка] = СтрЗаменить(ЗначениеСтроки[нКолонка-1],ОграничительСтроки,"");
КонецЦикла;
КонецЦикла;

Возврат ТабЗн;

КонецФункции

Пример использования приведен в обработке.

2 Comments

  1. etmarket

    Спасибо за публикацию. Есть вопрос. Как определяется кодировка в файле? Есть ли возможность определять ее автоматически?

    Reply
  2. Puser-x6

    к сожалению без использования сторонних библиотек получить кодировку нельзя.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *