1

Тема: 1Cv8: чтение больших текстовых файлов (csv)

Сделано по этому принципу: VBScript: работа с большими текстовыми файлами.
Функция читает файл и возвращает ТаблицуЗначений с данными файла.

Функция ПрочитатьCSV(Папка, ИмяФайла, КолПолей)
    // Параметры:
    // "Папка" - путь к файлу без имени файла с завершающим слешем,
    // "ИмяФайла" - имя файла,
    // "КолПолей" - количество колонок (число).
    // Функция возвращает ТаблицуЗначений с данными файла.
    
    Текст = "[" + ИмяФайла + "]
    |ColNameHeader=False
    |Format=Delimited(;)
    |TextDelimiter=none
    |CharacterSet=ANSI
    |";
    Для ы = 1 По КолПолей Цикл
        Текст = Текст + "Col" + ы + "=Field" + ы + " Text" + Символы.ПС;
    КонецЦикла;
    ТекстДок = Новый ТекстовыйДокумент;
    ТекстДок.УстановитьТекст(Текст);
    ТекстДок.Записать(Папка + "Schema.ini");
    
    objRec = Новый COMОбъект("ADODB.Recordset");
    strQuery = "SELECT * FROM [" + ИмяФайла + "]";
    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Папка + ";Extended Properties=""text;""";
    adOpenStatic = 3;
    adLockOptimistic = 3;
    adCmdText = 1;
    ТаблЗнач = Новый ТаблицаЗначений;
    Для ы = 1 По КолПолей Цикл
        ТаблЗнач.Колонки.Добавить();
    КонецЦикла;
    
    objRec.Open(strQuery, strConn, adOpenStatic, adLockOptimistic, adCmdText);
    КолСтрок = objRec.RecordCount;
    Ном = 1;
    Пока Не objRec.EOF Цикл
        Если Ном % 500 = 0 Тогда
            Состояние(ИмяФайла + " " + Ном + " из " + КолСтрок);
        КонецЕсли;
        НовСтр = ТаблЗнач.Добавить();
        Для i=0 По objRec.Fields.Count-1 Цикл
            НовСтр[i] = Строка(objRec.Fields(i).Value);
        КонецЦикла;
        objRec.MoveNext();
        Ном = Ном + 1;
    КонецЦикла;
    objRec.Close();
    Возврат ТаблЗнач;
КонецФункции

Помещение прочитанных строк в ТаблицуЗначений сделано "в лоб" и достаточно хорошо пожирает память (как сделать лучше, пока не знаю). Сама выборка из файла работает очень быстро. Файл размером 46 МБ (31 поле, 350 тыс. строк) был помещён в ТаблицуЗначений за порядка 12 минут (WinXP SP3, Pentium(R) Dual-Core CPU E5300 2.60 ГГц, 988 Mб ОЗУ).

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

2

Re: 1Cv8: чтение больших текстовых файлов (csv)

Другой способ. Скачиваем пакет Enterprise Integrator‎ (для нужного нам здесь функционала он бесплатен), устанавливаем из него единственный компонент "GameWithFire" (выбор в инсталляторе). Та же функция, с использованием этого пакета:

Функция ПрочитатьCSV_2(Папка, ИмяФайла, КолПолей)
    // Параметры:
    // "Папка" - путь к файлу без имени файла с завершающим слешем,
    // "ИмяФайла" - имя файла,
    // "КолПолей" - количество колонок (число).
    // Функция возвращает ТаблицуЗначений с данными файла.
    
    Текст = "[" + ИмяФайла + "]
    |ColNameHeader=False
    |Format=Delimited(;)
    |TextDelimiter=none
    |CharacterSet=ANSI
    |";
    Для ы = 1 По КолПолей Цикл
        Текст = Текст + "Col" + ы + "=Field" + ы + " Text" + Символы.ПС;
    КонецЦикла;
    ТекстДок = Новый ТекстовыйДокумент;
    ТекстДок.УстановитьТекст(Текст);
    ТекстДок.Записать(Папка + "Schema.ini");
    
    objRec = Новый COMОбъект("ADODB.Recordset");
    strQuery = "SELECT * FROM [" + ИмяФайла + "]";
    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Папка + ";Extended Properties=""text;""";
    adOpenStatic = 3;
    adLockOptimistic = 3;
    adCmdText = 1;
    objRec.Open(strQuery, strConn, adOpenStatic, adLockOptimistic, adCmdText);
    
    ПодключитьВнешнююКомпоненту("GameWithFire.ADOUtils");
    ADOUtils = Новый("AddIn.ADOUtils");
    Возврат ADOUtils.ADORecordsetToValueTable(objRec);
КонецФункции

Файл из предыдущего поста был помещён в ТаблицуЗначений на том же компьютере за чуть более минуты (т.е. на порядок быстрее).

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