Чтение данных csv файла с помощью ADODB.Connection
&НаСервереБезКонтекста
Функция ПрочитатьCSVвТЗ_ADO(ИмяФайла, Разделитель=";", ЗаголовкиИзПервойСтроки = Ложь)
ТаблицаРезультат = Новый ТаблицаЗначений;
ФайлДанных = Новый Файл(ИмяФайла);
Connection=Новый COMОбъект("ADODB.Connection");
Connection.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ФайлДанных.Путь+";Extended Properties=""text;HDR=No;IMEX=1;FMT=Delimited""");
// Так как FMT=Delimited(;) не работает создадим schema.ini
Схема = "[" + ФайлДанных.Имя+ "]
|ColNameHeader=False
|Format=Delimited("+Разделитель+")
|CharacterSet=ANSI
|";
Если Разделитель = "," Тогда
Схема = "[" + ФайлДанных.Имя+ "]";
КонецЕсли;
ФайлСхемы = Новый Файл(ФайлДанных.Путь+"Schema.ini");
ЗаписьТекста = Новый ЗаписьТекста(ФайлСхемы.ПолноеИмя, КодировкаТекста.ANSI);
ЗаписьТекста.Записать(Схема);
ЗаписьТекста.Закрыть();
RecordSet=Новый COMОбъект("ADODB.Recordset");
RecordSet.ActiveConnection = Connection;
RecordSet.Open("select * from "+ФайлДанных.Имя, Connection);
// определим имена колонок
Для НомерКолонки = 0 по RecordSet.Fields.Count-1 Цикл
ТаблицаРезультат.Колонки.Добавить(RecordSet.Fields(НомерКолонки).Name);
КонецЦикла;
Сч=0;
Пока НЕ RecordSet.EOF() Цикл
Сч=Сч+1;
НоваяСтрока = ТаблицаРезультат.Добавить();
Для й=0 по RecordSet.Fields.Count-1 Цикл
НоваяСтрока[й] = RecordSet.Fields(й).Value;
КонецЦикла;
RecordSet.MoveNext();
КонецЦикла;
RecordSet.Close();
Connection.Close();
Возврат ТаблицаРезультат;
КонецФункции
Для больших файлов нужно использовать Microsoft.Jet.OLEDB, а не построчное чтение средствами платформы. Понимает даты, числа и многострочные поля. Скорость: ~3000 строк в секунду.
На msdn можно найти описание грамматики и Schema.ini.
Из минусов - нужны права на запись файла схемы в каталог с csv-файлом...
Почему нельзя определить разделитель в строке подключения FMT=Delimited(;) описано здесь: https://stackoverflow.com/questions/51949360/adodb-connection-delimiter-semicolon-does-not-work-for-csv-text-files