Имя: Пароль:
1C
1С v8
Снова CSV. Как ускорить OLE?
, ,
0 Diamond905
 
16.06.14
11:45
// задаем кодировку
    charset = "windows-1251";
    //charset = "utf-8";
    
    Connection = Новый COMОбъект("ADODB.Connection");
    Connection.ConnectionString = ""
    + "Driver={Microsoft Text Driver (*.txt; *.csv)};"
    + "DriverId=27;"
    + "charset="    + charset    + ";"
    + "DefaultDir=" + Папка + ";"
    + "Extensions=csv;"
    + "HDR=NO;"  
    + "IMEX=1;"
    ;  
    
    Connection.open();
    
    sql = "SELECT * FROM " + ИмяФайла;
    
    Попытка
        adOpenStatic = 3;
        adLockOptimistic = 3;
        adCmdText = 1;
        
        objRec = Connection.Execute(sql,adOpenStatic, adLockOptimistic, adCmdText);        
    Исключение            
        
        //ОбработатьОшибки(Connection.Execute)
        Для каждого ADOErr из  Connection.Errors   Цикл
            err = "*** Execute() ERROR:"    + Символы.ВК
            + sql        + Символы.ВК
            + "Ошибка: " + ADOErr.Number    + Символы.ВК
            + " : " + ADOErr.Description + Символы.ВК
            + " : " + ADOErr.Source + Символы.ВК
            + " : " + ADOErr.SQLState + Символы.ВК
            + " : " + ADOErr.NativeError + Символы.ВК
            ;
            
            сообщить(err,СтатусСообщения.ОченьВажное);
            Возврат -1;
        КонецЦикла;  
        
    КонецПопытки;
    ТипКолонки = Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(200));

    ТаблЗнач = Новый ТаблицаЗначений;

    
    Первый = Истина;
    
    Пока Не objRec.EOF Цикл

        Если Первый Тогда
            Для i=0 По objRec.Fields.Count-1 Цикл
                ТаблЗнач.Колонки.Добавить(Строка(objRec.Fields(i).Value),ТипКолонки);
            КонецЦикла;
            
            objRec.MoveNext();
            Первый = Ложь;
        Иначе
            НовСтр = ТаблЗнач.Добавить();
            
            Для i=0 По objRec.Fields.Count-1 Цикл
                
                НовСтр[i] = Строка(objRec.Fields(i).Value);
                
            КонецЦикла;
            
            objRec.MoveNext();
        КонецЕсли;
        
    КонецЦикла;

    objRec.Close();

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


На 10000 строк получается 12-13 секунд. Нужно быстрее. Что то мне подсказывает что Строка(objRec.Fields(i).Value); - неоптимально. Наверняка можно както сразу строками хапать, или всю таблицу. Как это сделать или где почитать про сей вопрос?
1 МихаилМ
 
16.06.14
11:48
2 butterbean
 
16.06.14
11:48
попробуй сам файл разбирать, там ведь просто текст
3 ЗлобнийМальчик
 
16.06.14
11:49
(2) присоединяюсь
4 Diamond905
 
16.06.14
12:15
Быстрее не стало..

    Попытка
        adOpenStatic = 3;
        adLockOptimistic = 3;
        adCmdText = 1;
        
        objRec = Connection.Execute(sql);
        arr = objRec.GetRows();
        objRec.Close();
        МассивСтрок               = arr.Unload();
        ОбщееКоличествоСтрок      = МассивСтрок.Количество();

    Исключение            
        
        //ОбработатьОшибки(Connection.Execute)
        Для каждого ADOErr из  Connection.Errors   Цикл
            err = "*** Execute() ERROR:"    + Символы.ВК
            + sql        + Символы.ВК
            + "Ошибка: " + ADOErr.Number    + Символы.ВК
            + " : " + ADOErr.Description + Символы.ВК
            + " : " + ADOErr.Source + Символы.ВК
            + " : " + ADOErr.SQLState + Символы.ВК
            + " : " + ADOErr.NativeError + Символы.ВК
            ;
            
            сообщить(err,СтатусСообщения.ОченьВажное);
            Возврат -1;
        КонецЦикла;  
        
    КонецПопытки;
    ТипКолонки = Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(200));

    Первый = Истина;
    ТЗ = Новый ТаблицаЗначений;
    МассивИменКолонок = Новый Массив;

    Для Каждого Значение Из МассивСтрок[0] Цикл    
        ТЗ.Колонки.Добавить(Значение,ТипКолонки);
        МассивИменКолонок.Добавить(Значение);
    КонецЦикла;
    
    

    Для Инд = 1 По ОбщееКоличествоСтрок-1 Цикл
        НовСтр = ТЗ.Добавить();  
        НомерКолонки = 0;
        Для Каждого Значение из  МассивСтрок[Инд] Цикл    
            НовСтр[НомерКолонки] = Значение;
            НомерКолонки = НомерКолонки + 1;
        КонецЦикла;
    КонецЦикла;
5 Diamond905
 
16.06.14
12:15
(2) Как?
6 f_vadim
 
16.06.14
12:18
Обалдели совсем. Текстовые файлы через OLE читать.
7 f_vadim
 
16.06.14
12:22
Ещё и через ADO!
8 Черный бухгалтер
 
16.06.14
12:22
(0) А помимо .Value там что-нибудь типа .Data или .Text есть?
9 dj_serega
 
16.06.14
12:31
(7) Ну так ADO же ОООООЧЕНЬ быстрая штука :)
10 vi0
 
16.06.14
12:31
попробуй BULK INSERT в T-SQL
11 MikhaDi4
 
16.06.14
13:57
А построчно средствами 1с читать небыстрее будет?
12 РенеДекарт
 
16.06.14
14:05
(11)не быстрее
вместо ЧтениеТекста - использовать FileSystemObject.
(0) хрень какая-то. Но спасибо за пример чтения текстового файла запросом SQL через виндовый-майкрософтовый ADO.
Еще с замерами - цены бы не было.
13 Serginio1
 
16.06.14
14:31
(0) По моему вручную и то быстрее будет
v8: Преобразование csv в таблицу значений, продолжение
14 Diamond905
 
16.06.14
16:12
Да оказалось что много уходит на разбор даты-времени, которая приходит в текстовом виде.. будем думать.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn