ADO CSV
Есть файл CSV. Сделал внешний отчет который формируется по этому файлу. В начале сделал через ТекстовыйДокумент. Но после столкнулся с проблемой производительности. Из за того что размер файла больше 30мб решил доработать чтение csv через ado. Но столкнулся с проблемой. Проблема заключается в том что я не могу получить коллекцию колонок из за специфичного содержания файла. Первые две строки содержат разделитель колонок.
Как можно пропустить в ado эти колонки что бы начать чтение строки с 3-й строки?
Код чтения:
Содержание файл:
"sep" - это символ разделителя
Как можно пропустить в ado эти колонки что бы начать чтение строки с 3-й строки?
Код чтения:
Для Каждого Строкамассива из МассивАдресов Цикл
УдалитьФайлы(ВременныйКаталог, "*");
// Временный файл
id = id+1;
ФайлИмя = "КК" + Строка(id) + ".csv";
Путь = ВременныйКаталог + ФайлИмя;//ПолучитьИмявременногоФайла(".csv");
Файл = ПолучитьИзВременногоХранилища(Строкамассива);
Файл.Записать(Путь);
Сon nectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq="+ВременныйКаталог+";Extensions=asc,csv,tab,txt;";
Попытка
// Инициализация основного объекта ADODB.Connection. Открытие соединения.
ADODBConnection = Новый COMОбъект("ADODB.Connection");
ADODBConnection.ConnectionString = СonnectionString;
ADODBConnection.Open();
// Импирически определенный параметр для правильного определения количества строк листа.
ADODBConnection.CursorLocation = 3; // По-умолчанию 2.
Исключение
Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);
Возврат Новый ТаблицаЗначений; // В случае ошибки возвращаем пустую таблицу значений.
КонецПопытки;
ТекстЗапроса = "SEL ECT * FR OM ["+ФайлИмя+"]";
// Создание Recordset. Дочерний объект ADODBConnection. Набор записей по запросу.
Попытка
ADODBRecordset = Новый COMОбъект("ADODB.Recordset");
ADODBRecordset.Open(ТекстЗапроса, ADODBConnection);
ADODBRecordset.MoveNext();
ADODBRecordset.MoveNext();
// Проверка заполненности листа.
Если (ADODBRecordset.EOF ИЛИ ADODBRecordset.BOF) Тогда
КолвоСтрокExcel = 0;
//Сообщить(НСтр("ru = '" + ИмяЛиста + ": не содержит данных.'"), СтатусСообщения.Внимание);
// Завершение работы.
// Закрытие Объектов.
ADODBRecordset.Close();
ADODBConnection.Close();
ADODBRecordset = Неопределено;
ADODBConnection = Неопределено;
Возврат Новый ТаблицаЗначений; // В случае ошибки возвращаем пустую таблицу значений.
КонецЕсли;
// Импирически определенные параметры для правильного определения количества строк листа.
ADODBRecordset.AbsolutePage = 1;
ADODBRecordset.AbsolutePosition = 1;
Исключение
Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);
Возврат Новый ТаблицаЗначений; // В случае ошибки возвращаем пустую таблицу значений.
КонецПопытки;
// Параметр, возвращаемый в вызывающую процедуру.
КолвоСтрокExcel = ADODBRecordset.RecordCount + 1; // (+1) - учет Строки-Заголовока, которая "съедается".
КолвоКолонокExcel = ADODBRecordset.Fields.Count;
КонецЦикла;
ПоказатьСодержание файл:
"sep="
" "" "
Колонка1Колонка2Колонка3Колонка4
" "" "
Колонка1Колонка2Колонка3Колонка4
"sep" - это символ разделителя
По теме из базы знаний
Найденные решения
Ну и все равно переделай чтение через ТекстовыйДокумент на через ЧтениеТекста, как я выше писал.
ТекстовыйДокумент заточен на произвольный доступ в памяти для небольших файликов и нелинейно тормозит на больших объемах.
А ЧтениеТекста - человеческое последовательное чтение из файла, производительность которого зависит от размеров файла исключительно линейно.
ТекстовыйДокумент заточен на произвольный доступ в памяти для небольших файликов и нелинейно тормозит на больших объемах.
А ЧтениеТекста - человеческое последовательное чтение из файла, производительность которого зависит от размеров файла исключительно линейно.
(86) Это на тестовом файле проблема производительности не в этом. Но он же и файлы побольше собирался грузить. Поэтому эта оптимизация в любом случае будет не лишней, о чем я и написал. Это даже не оптимизация. Это просто использование надлежащего инструмента. А для оптимизации производительности на тестовом файле я еще в (38) соглашался, что необходимо оптимизировать преобразование типов.
Остальные ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)