Имя: Пароль:
1C
1C 7.7
v7: Из csv в 1с через ADODB
0 Sorokin1985
 
28.07.16
16:25
Здравствуйте! столкнулся с несколькими проблемами при загрузке файла csv через ADODB в 1с 7.7
Файл имеет вид:
информация;дата в виде 25.07.2016;дата в виде 25.07.2016  16:36:00;

1) При получении значения из файла дата в виде 25.07.2016  16:36:00 возвращается как  25.07.2016
2) не умею писать условия в запросе. нужно сравнить дату с датой документа

Процедура Эксперимент()

    ИмяФайла = КаталогЗагрузки + ФайлЗагрузки;
    
    Если (СокрЛП(КаталогЗагрузки)="") или (СокрЛП(ФайлЗагрузки)="") ТОгда
        Возврат;
    КонецЕсли;  
    
    //создать schema.ini с нужными параметрами в той же директории что и файл для загрузки
    СоздатьSchemaINI();  
    
    db       = CreateObject("ADODB.Connection");
    db.CursorLocation= 3;      
    
    СтрокаПодключенияCSV = "
    |Provider=Microsoft.Jet.OLEDB.4.0;
    |Data Source="+КаталогЗагрузки+";
    |Extended Properties=""text;HDR=NO;FMT=Delimited;""";
    
    db.Open(СтрокаПодключенияCSV);
    
    НаборЗаписей   = CreateObject("ADODB.Recordset");
    НаборЗаписей.ActiveConnection   = db;
    НаборЗаписей.CursorType         = 3;
    НаборЗаписей.LockType           = 2;
    
    
    
    Запр = "select    
    |     F2 as ДатаТранзакции,
    |     F3 as ДатаВремяТранзакции    //Не знаю!
    |FROM ["+ФайлЗагрузки+"]";
    //|WHERE ДатаТранзакции=ДатаДок";//Не знаю!    
    
    
    НаборЗаписей.Source = Запр;
    //НаборЗаписей.Source = "SELECT * FROM ["+ФайлЗагрузки+"]";
    НаборЗаписей.Open();    
    
    Сообщить(НаборЗаписей.RecordCount);    
    
    Если (НаборЗаписей.EOF() <> 0) И (НаборЗаписей.BOF() <> 0) Тогда
        Сообщить("Составленый запрос неверен - ничего не находит");
    Иначе
        
        НаборЗаписей.MoveFirst();
        Пока НаборЗаписей.EOF() = 0 Цикл//Получает строку
            
            Если 1=1 Тогда  
                Сообщить(НаборЗаписей.Fields(0).Value);
                Сообщить(НаборЗаписей.Fields(1).Value);
                

                НаборЗаписей.MoveNext();
                
                Если   НаборЗаписей.AbsolutePosition = 10 Тогда
                    Прервать;    
                КонецЕсли;    
                
            КонецЕсли;    
            
        КонецЦикла;
        
    КонецЕсли;
КонецПроцедуры
1 Fragster
 
гуру
28.07.16
16:31
Сообщить(НаборЗаписей.Fields(2).Value);  где???
2 Sorokin1985
 
28.07.16
16:33
так запросом отсекается! остается всего две колонки с датами
Сообщить(НаборЗаписей.Fields(0).Value); //Дата
Сообщить(НаборЗаписей.Fields(1).Value); //дата время
3 aka AMIGO
 
28.07.16
16:34
csv - это обычный текстовый файлик..
ИМХО - зачем мудрить..
4 Sorokin1985
 
28.07.16
16:36
Мудрить для того что 100к строк и 20 столбцов перебирать через
Функция РазобратьСтроку(Стр)
    СтрРазб = Стр+";";
    Рзд = ";";
    Сп  = СоздатьОбъект("СписокЗначений");
    Если Лев(СтрРазб,1) = Рзд Тогда
        СтрРазб = Сред(СтрРазб, 2);
    КонецЕсли;
    Инд = Найти(СтрРазб, Рзд);
    Пока Инд <> 0 Цикл
        ТекСтр = Сред(СтрРазб, 1, Инд - 1);
        Сп.ДобавитьЗначение(СокрЛП(ТекСтр));
        СтрРазб = Сред(СтрРазб, Инд + 1);
        Инд = Найти(СтрРазб, Рзд);
    КонецЦикла;                              
    Возврат Сп;
КонецФункции  
очень медленно
5 Sorokin1985
 
28.07.16
16:38
это за день. в конце месяца с файл нарастающий 30*100к строк. очень долго грузит. Хочу разогнать.
6 Ёпрст
 
гуру
28.07.16
16:38
(0)
1. cast или convert к нужному типу, но, не поможет, в клюшках дата без времени
2. просто приведи строку к дате и привет, сравнивай.
7 Sorokin1985
 
28.07.16
16:40
cast или convert в самом запросе? Не подскажите синтаксис?
8 Garykom
 
гуру
28.07.16
16:40
(3) Думают "специальными методами" это быстрее чем банальный текст.
9 Sorokin1985
 
28.07.16
16:40
да быстрее. в разы быстрее.
10 Sorokin1985
 
28.07.16
16:41
как перепишу. сравнение сделаю. по скорости загрузки.
11 Garykom
 
гуру
28.07.16
16:42
(10) Ты главное код по загрузке текста покажи и специальными методами ))
12 Garykom
 
гуру
28.07.16
16:43
(11)+ код в (4) писал кто то "шибко вумный"
13 Sorokin1985
 
28.07.16
16:46
Есть решения лучше по заполнению таблицы значений из текстового(csv) файла?
14 Fragster
 
гуру
28.07.16
16:52
в первой строке надо, чтобы даты были со временем. оно типы по ней получает.
15 Sorokin1985
 
28.07.16
16:55
(14)
Не понил!
16 MM
 
28.07.16
16:56
Похоже нужно отобрать из большого файла ограниченное число строк? Так разве проще не разбирать каждую прочитанную v7plus строку кодом 1С, а применять к ней Найти, если в строке есть нужный текст обрабатывать её подробнее.
17 Ёпрст
 
гуру
28.07.16
16:57
(7) оно тебе не нужно, в клюшках нету даты со временем.
18 Garykom
 
гуру
28.07.16
17:00
(13) Пару строчек из cvs покажи, нуна видеть как там строки отделены и есть ли внутри строк " или ;
19 Garykom
 
гуру
28.07.16
17:00
(18) *из csv - комма сепаратед валуе
20 Fragster
 
гуру
28.07.16
17:00
(17) хм. а это может все испортить :) т.е. автору нужно грузить в восьмерку? или делать каст в строку?
21 Sorokin1985
 
28.07.16
17:01
(16)
Да верно из большого файла отобрать только некоторые строки и загрузить их в табличную часть документа с определённой датой.
Через найти сделано сейчас идет поиск даты. и это очень медленно.
22 Sorokin1985
 
28.07.16
17:02
(18)
139;139;T005724;1607_ГАРЕНСКИХ П.А.;25.07.2016;25.07.2016 16:36:00;031;1;4;Социальная карта москвича;255;9643907704014900319;Оплата проезда;11;1;30.00;0.00
23 Fragster
 
гуру
28.07.16
17:02
дату можно передавать литералом вида "ГГГГ-ММ-ДД чч:мм:сс" (ну, или как там правильно)
24 Sorokin1985
 
28.07.16
17:02
(18)
139;139;T005724;1607_ГАРЕНСКИХ П.А.;25.07.2016;25.07.2016 16:36:00;031;1;4;Социальная карта москвича;255;9643907704014900319;Оплата проезда;11;1;30.00;0.00
139;139;T005724;1607_ГАРЕНСКИХ П.А.;25.07.2016;25.07.2016 14:32:07;031;1;2;Социальная карта москвича;255;9643907705085500151;Оплата проезда;11;1;30.00;0.00
139;139;T005724;1607_ГАРЕНСКИХ П.А.;25.07.2016;25.07.2016 15:28:40;031;1;3;Социальная карта москвича;255;9643907711134701667;Оплата проезда;3;7;30.00;0.00
25 Ёпрст
 
гуру
28.07.16
17:04
(20) тема вроде в клюшках, значит в клюшки
26 Sorokin1985
 
28.07.16
17:05
(23)
Можно? КАК? запросом  'дата время' обрезается до даты
27 Ёпрст
 
гуру
28.07.16
17:06
(21) че ты привязался к дате ?
в запросе кастани к date и привет
28 Ёпрст
 
гуру
28.07.16
17:06
(26) в 7.7 нет времени, там тока дата.
29 Ёпрст
 
гуру
28.07.16
17:07
или тебе куда надо, мот ты секцией ошибся ?
30 Garykom
 
гуру
28.07.16
17:08
(22)(24) А какие строки и по каким признакам отбирать/грузить?

Если нужна обработка всего файла с разделением к примеру данных по одной карте (но всех) в один документ то проще обработать все через СтрЗаменить(лСтрока, ";", РазделительСтрок)

Если все строчки грузить/делить не надо а нужна выборка то RegExp'ы в руки.
31 Sorokin1985
 
28.07.16
17:08
(27)
время в табличной части документа. загружается из файла.
32 Garykom
 
гуру
28.07.16
17:11
(30)+ Кста если данных много то создание объектов и их запись в базу будут напряжнее по времени/загрузке компа чем чтение и парсинг.
Транзакции изучать с подбором оптимального кол-ва записей для обработки.
33 Sorokin1985
 
28.07.16
17:13
(32)
согласен. на данный момент как то так.
1) 40 минут перебор файла
2) Час создание и запись в документы.
34 Ёпрст
 
гуру
28.07.16
17:15
так, че хоть возвращает ?

cast(F3 as varchar) as ДатаВремяТранзакции
35 Garykom
 
гуру
28.07.16
17:16
(33) Перебор можно сократить до 5-10 минут
Запись в документы если в это время больше никто/ничто не работает до 30 минут легко через транзакции.
36 Sorokin1985
 
28.07.16
17:18
(34)
Не взлетает.
НаборЗаписей.Open();
37 Sorokin1985
 
28.07.16
17:19
(35)
как сократить? СтрЗаменить Не подходит.
38 Ёпрст
 
гуру
28.07.16
17:23
а так ?
select top 10 * from ....

Сообщить(НаборЗаписей.Fields(1).Value);
Сообщить(НаборЗаписей.Fields(2).Value);
Сообщить(НаборЗаписей.Fields(3).Value); //тут что ?
39 Ёпрст
 
гуру
28.07.16
17:24
точнее, тут ?
Сообщить(НаборЗаписей.Fields(6).Value);
40 Sorokin1985
 
28.07.16
17:26
(38)
вернул 10 строк. Дата время опять только Дата
41 Sorokin1985
 
28.07.16
17:28
(39)
Надо правильно кастануть. Но как по синтаксису я не знаю...
42 Garykom
 
гуру
28.07.16
17:29
(37) Чем не подходит "СтрЗаменить" ?
43 Garykom
 
гуру
28.07.16
17:31
И самое главное... чем не подходит открыть этот файлик чем то (access например) и записать в формате DBF к примеру? А далее через штатный XBase.
44 Ёпрст
 
гуру
28.07.16
17:38
(41) скорее всего, драйвер при прочтении колонки воспринимает его как дату, а надо, как текст. д ля этого можно попробовать положить рядом с файлом scv файлик shema.ini в котором явно указать тип колонки как строка.
45 Ёпрст
 
гуру
28.07.16
17:40
тип того

[твоёимя.csv]
Format=Delimited(;)
DecimalSymbol=.
ColNameHeader=False
Col1="ДатаВремя" Text
46 Ёпрст
 
гуру
28.07.16
17:44
ну или попробуй с такой строкой , для начала:

|Extended Properties=""text;HDR=NO;FMT=Delimited(;);""";
47 ProgAL
 
28.07.16
18:19
(0) Проверьте почту.
48 Злопчинский
 
28.07.16
18:35
ну кинь мне на e.meil@mail.ru файлик который надо разобрать в 100К строк - я вот не поленюсь ради интереса проверю, скольо он штатно будет грузится без выкрутасов - я думаю достаточно быстро.

или лучше в скайп Zlopun кинь
49 Garykom
 
гуру
28.07.16
18:37
(48) Нафик те этот файлик, возьми строчку выложенную и склонируй 100К раз в файл.
50 Злопчинский
 
28.07.16
18:39
//********************************************************************************************************
//
Функция глРазложитьИзСтроки(парамСтрока,СимволРазделитель="‡") Экспорт
    
    темпСтрока = СокрЛП(парамСтрока);                                 
    темпСтрока = """"+темпСтрока+"""";                                    темпСтрока = СтрЗаменить(темпСтрока,СимволРазделитель,""",""");
    темпСЗ = СоздатьОбъект("СписокЗначений");
    темпСЗ.ИзСтрокиСРазделителями(темпСтрока);
    Возврат темпСЗ;
    
КонецФункции //глРазложитьИзСтроки()
51 Злопчинский
 
28.07.16
18:52
100'000 строк из (0)

загрузка типовыми методами

начало 18:51:03
конец 18:51:11
52 Злопчинский
 
28.07.16
19:00
83% времени - чтение стандартно Т.ПолучитьСтроку(стр)
53 Злопчинский
 
28.07.16
19:07
минимально нештатно (FSO)

начало 19:06:02
конец 19:06:04

зачем тут рукоблудить еще как-то?
54 Злопчинский
 
28.07.16
19:09
"Мой гений дарит вам"

//*******************************************
Процедура СформироватьШтатно()
    
    Сообщить("начало "+ТекущееВремя());
    СЗ = СоздатьОбъект("СписокЗначений");
    
    Т = СоздатьОбъект("Текст");
    Т.Открыть("d:\test.txt");
    КС = Т.КоличествоСтрок();
    Для ы=1 По КС Цикл Стр = СокрЛП(Т.ПолучитьСтроку(ы));
        Стр = """"+Стр+""""; Стр = СтрЗаменить(Стр,";",""","""); СЗ.ИзСтрокиСРазделителями(Стр);
        Информация = СЗ.ПолучитьЗначение(1); ТипаДата = СЗ.ПолучитьЗначение(2); ТипаДатаВремя = СЗ.ПолучитьЗначение(3);
    КонецЦикла;
    Сообщить("конец "+ТекущееВремя());
    
КонецПроцедуры

//*******************************************
Процедура Сформировать()
    
    Сообщить("начало "+ТекущееВремя());
    СЗ = СоздатьОбъект("СписокЗначений");
    
    глFSO = СоздатьОбъект("Scripting.FileSystemObject");
    Т = глFSO.OpenTextFile("d:\test.txt",1,0,0);

    Пока Т.AtEndOfStream=0 Цикл Стр    = Т.ReadLine();
        Стр = """"+Стр+""""; Стр = СтрЗаменить(Стр,";",""","""); СЗ.ИзСтрокиСРазделителями(Стр);
        Информация = СЗ.ПолучитьЗначение(1); ТипаДата = СЗ.ПолучитьЗначение(2); ТипаДатаВремя = СЗ.ПолучитьЗначение(3);
    КонецЦикла;
    
    Т.Close();     
    Сообщить("конец "+ТекущееВремя());
    
КонецПроцедуры
55 Garykom
 
гуру
28.07.16
19:15
(51) Хороший компик и SSD диска?
56 Злопчинский
 
28.07.16
19:29
не, файловый сервер обычный 6-летней давности
специально для вас - затеститрую на старом офисном компе
57 Злопчинский
 
28.07.16
19:30
6 млн строк (там же)

начало 19:26:58
конец 19:29:14
58 Злопчинский
 
28.07.16
19:32
блиииинннн, у меняна офисном компе 1ска даже запустилась...
59 Злопчинский
 
28.07.16
19:34
на офисном компе 100К строк
начало 19:32:47
конец 19:32:49
60 Злопчинский
 
28.07.16
19:37
на офисном компе 6млн строк
начало 19:34:14
конец 19:36:03
61 Злопчинский
 
28.07.16
19:38
итого: вопрос-навоз
имхо не имеет смысл стрелять из пушки по воробьям в части оптимизации чтения из файла
62 Fragster
 
гуру
28.07.16
19:38
(50)(60) если ты почитаешь спецификацию csv, то поймешь, что просто  глРазложитьИзСтроки(парамСтрока,СимволРазделитель="‡") не катит здесь.
Например
а;"а";"а;а";а - это четыре поля
63 Fragster
 
гуру
28.07.16
19:41
ну и преобразование примитивных типов какое-никакое тоже должно быть (хоть у (0) и не актуально)
64 Garykom
 
гуру
28.07.16
19:42
(62) Ну моя как бы в курсе см (18) и мона же хитрее замены сделать
65 Garykom
 
гуру
28.07.16
19:43
(63) преобразование как раз проще, но да время на него тоже будет потрачено поэтому и написал что для 100К легко уложиться в 5-10 минут
66 Злопчинский
 
28.07.16
19:46
(62) если нужен и универсальный и быстрый - трахаются пусть дальше. если обговорить "соглашения о протоколе обмена" - то см. выше, на 3 млн строк - 1 минута будет. раз в месяц или даже день или даже час - это не напряг. даже если в исходном файле строки некузявые - прочитали, строку, нормализовали, далее как обычно.
67 Злопчинский
 
28.07.16
19:47
(63) вполне возможно что большую часть времени как раз будет жрать не чтение файла, а всякая "арифметика" и кибениматика
68 ADirks
 
29.07.16
08:42
кстати, в ИТ есть метод для чтения из csv


ИндексированнаяТаблица :: ИзФайла / LoadFromFile

Синтаксис: ИзФайла(стрИмяФайла, [чФормат = 1], [чСИменамиКолонок = 1])

Параметры:
стрИмяФайла - тип: Строка. Имя файла, из которого нужно считать таблицу.
чФормат - тип: Число. Формат файла. Может принимать следующие значения: 1 - запись значений во внутреннем формате; 2 - запись значений во внешнем формате; 3 - csv файл со значениями во внутреннем формате; 4 - csv файл со значениями во внешнем формате.
чСИменамиКолонок - тип: Число. 1 - в первой строке файла хранятся имена колонок. Имеет смысл только для csv-файлов. Если параметр = 0, то имена колонок образуются как __col__<НомерКолонки>.
Возвращает: тип: Число. 1 - таблица считана успешно; 0 - ошибка при чтении.
69 lEvGl
 
гуру
29.07.16
09:21
почему никто не предлагает брать из первоисточника? csv же наверно выгрузка, а база на скл или еще какой СУБД. Прямые запросы к базе и все хорошо (хотя может конечно программулина-родитель и пишет напрямую в csv, но это ппц что за продукт тогда)
71 Fragster
 
гуру
29.07.16
10:32
(64) Garykom = Злопчинский ?
72 Garykom
 
гуру
29.07.16
11:40
(71) Откуда такой вывод?
73 Fragster
 
гуру
29.07.16
11:45
(72) сообщение (62) написано для Злопчинский , а отвечаешь ты
74 Garykom
 
гуру
29.07.16
12:05
(73) Это не ответ а комментарий баяна что "форматы CSV" бывают разные на пратике.
75 Garykom
 
гуру
29.07.16
12:05
(74) *практике