![]() |
|
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) *практике
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |