Вход | Регистрация
    1  2  3  4   
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Необходим быстрый поиск информации в больших CSV файлах

v7: Необходим быстрый поиск информации в больших CSV файлах
Я
   evgpinsk_
 
01.05.21 - 13:07
Есть прайс в формате CSV площадки onliner.by
В нём 700 тыс позиций.
Раз в сутки прайс обновляется.

Стоит задача в 1с получать быстрый доступ к цене определённого товара из данного прайса (скорость желательна в пределах нескольких секунд).
В прайсе есть столбец "IDтовара" по которому будет осуществляться поиск.

Вопрос: Каким образом осуществлять поиск, через какие инструменты?
   ДенисЧ
 
1 - 01.05.21 - 13:08
булкой в скуль-сервер и там искать.
   Garykom
 
2 - 01.05.21 - 13:13
(1) Нахер?
Я бы индекс тупо построил пробежав один раз и вытащив id, и начало/конец символов нужных данных привязав их к id
   evgpinsk_
 
3 - 01.05.21 - 13:14
(2) т.е. импортировать данные в dbf файл?
   Garykom
 
4 - 01.05.21 - 13:15
(3) нафик в регистр запиши если 1Сник
   evgpinsk_
 
5 - 01.05.21 - 13:15
(1) что за булка? )
   Garykom
 
6 - 01.05.21 - 13:16
   Garykom
 
7 - 01.05.21 - 13:16
(6)+ Но не советую разом весь файл в 700к, лучше по 10к порциями
   1CnikPetya
 
8 - 01.05.21 - 13:17
(4) У человека 7ка, какой регистр )

Можно в Номенклатуру добавить периодический реквизит ПоложениеВПрайсе и обновлять его ежедневно.
   Garykom
 
9 - 01.05.21 - 13:17
(8) Эээ я как то отвык уже от 77
   ДенисЧ
 
10 - 01.05.21 - 13:18
(7) Как раз булка-то и нужна, чтобы сотнями тысчк писать, это же не инсерт
   Garykom
 
11 - 01.05.21 - 13:18
(8) Не не никаких периодических это тормоза
Тогда да лучше dbf с индексом
   evgpinsk_
 
12 - 01.05.21 - 13:19
Да, изначально у меня мысли были или DBF или MySql.
Но может ещё есть какие-то несложные инструменты?
   Garykom
 
13 - 01.05.21 - 13:24
(12) экселем открываешь csv и сохраняешь как dbf - это можно автоматизировать
далее средствами 1С навешиваешь индекс и юзаешь
   evgpinsk_
 
14 - 01.05.21 - 13:27
(13) CSV-Прайс просто не очень красивый формат имеет.
Цены магазинов идут в одной строке на товар. Сейчас столбцов в прайсе 180штук
https://prnt.sc/12cskh0
   trdm
 
15 - 01.05.21 - 13:31
(2) ++
(13) ++
(14) и что? просто нормализуй dbf-ку.
   evgpinsk_
 
16 - 01.05.21 - 13:31
В принципе можно ограничиться минимальными ценами ограниченного числа магазинов. Например читать только первые 20 столбцов.
Каким инструментом оптимально экспортировать из Excell в DBF?
   Garykom
 
17 - 01.05.21 - 13:34
(16) дык сам эксель или либреофис и умеют сохранять в dbf
   evgpinsk_
 
18 - 01.05.21 - 13:39
(17) С 2007 офиса уже не сохраняет в DBF
   Garykom
 
19 - 01.05.21 - 13:44
(18) ыыыы
я на libreoffice давно перешел
   Garykom
 
20 - 01.05.21 - 13:46
короче как бы делал я чтобы было очень шустро для 77
написал бы за полчаса простейшую консольную утилиту на go которая csv2dbf.exe
затем запускал бы ее с параметрами из 77 и все
   Garykom
 
21 - 01.05.21 - 13:48
(20)+ самый смак это если файловая то прямо в специально созданную объекту в 1С прямо в dbf табличку писать
ну или для sql 1С 77 аналогично сразу в mssql табличку
   Garykom
 
22 - 01.05.21 - 13:49
(21)+ а искал бы в 1С запросами, они там тупые но вполне шустрые
   Garykom
 
23 - 01.05.21 - 13:52
(20) даже не полчаса а минут 20 с тестами
1. https://golangs.org/parsing-csv
2. https://github.com/LindsayBradford/go-dbf
   Garykom
 
24 - 01.05.21 - 13:56
(23)+ даже есть готовое но не в ту сторону
https://github.com/lancecarlson/dbfcsv

и есть готовое на питоне
https://github.com/Kanahiro/dbfConverter
в обе стороны
   trdm
 
25 - 01.05.21 - 14:04
(24) а питон может компилиться в екзешник.
   Garykom
 
26 - 01.05.21 - 14:08
(25) там уже скомпилено
но имхо не люблю питон, пришлось вынужденно слегка выучить но не люблю, раздражает
   Garykom
 
27 - 01.05.21 - 14:09
(26)+ для питон это как раньше бейсик был - язык для косячных дебилов
   Garykom
 
28 - 01.05.21 - 14:11
(27)+ по этой же причине и js с нодой сча бесят, ибо эти косячные просто в веб приперлись и там начали говнокодить
TypeScript в этом плане сильно лучше
   trdm
 
29 - 01.05.21 - 14:36
(26) сам не люблю, но иногда это самый оптимальный инструмент.
   Djelf
 
30 - 01.05.21 - 16:10
(0) Лучше конечно конвертировать во что-то более вразумительное чем csv, об этом уже все написали.
Но можно и sqlite прикрутить: https://infostart.ru/public/805029/ (в 7м посте без СМ выложено).
 
 
   evgpinsk_
 
31 - 01.05.21 - 16:13
(30) В CSV исходный прайс, который даёт площадка
   Djelf
 
32 - 01.05.21 - 16:27
(31) И что из этого следует? Это было очевидно...
Ты прочитал что написано в описании по ссылке в (30)?
Быстрее возможно сделать, но скорость запроса будет примерно на 5% выше, т.к. накладные расходы у sqlite очень не высокие.
   evgpinsk_
 
33 - 01.05.21 - 16:37
(32) Да, прочитал. Сейчас уже понял в (30) смысл 1го предложения.
sqlite у меня используется кое-где в конфигурации (прямые запросы к справочникам) - скорость изумительная.
По ссылке на инфостар - буду смотреть.
   ДедМорроз
 
34 - 01.05.21 - 19:51
Csv файл - это файл последовательного доступа,поэтому его нужно хотя бы один раз прочитать весь.
И,если мы его читаем весь,то его можно скорректировать во что-то другое.
Я вот в нем логи анализировал,которые за час на несколько гигов набивались,и,нужно сказать,что читаешь и в какую-то sql-базу,так как там потом проще вести анализ.
Опять же,если там много колонок с ценами,то можно распределить по отдельным строкам,только нужно будет идентификатор товара придумать.
   trdm
 
35 - 02.05.21 - 10:16
(30) Там только dll-ка, примера нет.
   evgpinsk_
 
36 - 02.05.21 - 10:46
(35) Да, жаль )
   Бертыш
 
37 - 02.05.21 - 12:12
(8) Не преувеличивайте коллега. Я в 2003 ем году делал эмуляцию регистра сведений для 7.7 на регистрах накопления
(0) CSV это текст. Грамотно составленное RegExp выражение в скрипте на пайтоне спасёт отца русской демократии. Весь то файл Вам зачем
   evgpinsk_
 
38 - 02.05.21 - 13:07
(37) Как минимум нужно быть знакомым с пайтоном ).
поиск в CSV более медленный, чем с использованием индексов
   ДедМорроз
 
39 - 03.05.21 - 00:20
(37) если искать только один раз,то да RegExp чем-то поможет,если искать несколько раз,то проще один раз распарсить.
   acanta
 
40 - 03.05.21 - 09:00
А если искать постоянно? То есть использовать csv в качестве базы данных (лог файл, дописывается в конец) и отчеты собрать по нему?
   Mikeware
 
41 - 03.05.21 - 11:04
(40) "дописывается в конец", и "собрать 1 отчет в несколько дней" (ну или "изредка поискать") - это не совсем "БД". Хотя некоторым критериям ("структурирована", "соответсвует схеме") соотвествует БД, но по "типизации", "произвольному доступу к полям" - не соотвествует. Из-за этого сложнее построить лополнительне структуры для улучшения поиска (индексы). поэтому "постоянный поиск" по цсв - плохая идея.
   acanta
 
42 - 03.05.21 - 11:10
(41) но эксель открывает файлы csv и позволяет использовать пусть не все, но какие то механизмы обработки файлов баз данных...
   Mikeware
 
43 - 03.05.21 - 11:19
(42) когда "эксель открывает файлы csv" ("импортирует", если быть точным) - он проделывает туеву хучу дополнительной работы. Например, разделяет "по полям", и "типизирует". Именно это приводит относительно регулярную текстовую структуру к регулярной таблице.
   acanta
 
44 - 03.05.21 - 11:21
В чем разница между импортом екселя и булк инсертом sql?
   Mikeware
 
45 - 03.05.21 - 11:24
(44) как посмотреть. с однй стороны ее почти нет (текст преобразовывается в регулярную таблицу), с другой разница большая в скорости, в объеме возможных преобразований, и полученном результате.
   acanta
 
46 - 03.05.21 - 11:43
Но в случае екселя результат в оперативной памяти и возможно, во временном файле. А в случае sql только файл. Проблема в том, что оперативная память с наведением красоты медленнее или в том что исходный файл читают дважды и разные получатели?
   Mikeware
 
47 - 03.05.21 - 11:50
(46) "Но в случае екселя результат в оперативной памяти и возможно, во временном файле." а возможно, и в постоянном.
"А в случае sql только файл." - а в случае sql в файл это попадет только после записи. но даже запись в файл не мешает висеть в кэше.

"Проблема в том, что оперативная память с наведением красоты медленнее или в том что исходный файл читают дважды и разные получатели?" - видимо, проблема в ДНК...
   acanta
 
48 - 03.05.21 - 13:40
Или в том, в каком возрасте и в каком объеме изучать английский, чтобы то, что написано нашими программистами на современных языках программирования, имело хоть какой-то смысл?
   Alex_Alexsin_2020
 
49 - 03.05.21 - 13:49
можно на шарпе написать (будет время пошарю у себя я уже делал себе) но поиск в текстовых файлах
создаем индексный файл и ищем

но в любом случае боюсь что в пределах 1 секунды не сможет найти насколько помню 10 тысяч записей в пределах где то 30 сек ищет
   Alex_Alexsin_2020
 
50 - 03.05.21 - 13:50
это я делал для загрузки в 1С данных из сторонних источников так как 1С обычно долго думала
   acanta
 
51 - 03.05.21 - 13:57
Вот я не понимаю смысла в полнотекстовом поиске в 1с. У клиентов после третьего повреждения отключила. По подстроке искать в нескольких колонках с представлениями и фильтровать по результатам динамический список?
Я понимаю, что ексель это может и это очень круто..
   ДедМорроз
 
52 - 03.05.21 - 13:59
Excel определяет тип колонки на лету,а для создания таблицы его нужно указать,и если в разных строках есть разные типы,то для sql это очень печально.

Я делал базу данных на текстовых файлах,для создания индекса нужно запомнить только позиции начала строк в файле,а также выбрать целевые поля.
Если индекс работает эффективно и мы выбираем всего несколько записей,то распарсить строку с начала до перевода строки-это не критично по скорости.
При желании,можно даже допустить добавление строк в конец файла.
Если предположить,что наличие в начале строки специальног символа # означает,что строка игнорируется,то можно даже делать редактирование - если новая строка влазит по месту старой,то может остаться хвост комментария,а если не влазит,то она превращается в комментарий и новое значение пишется или в конец или на место комментария подходящего размера.
   Alex_Alexsin_2020
 
53 - 03.05.21 - 14:02
(0) если не затруднит напишите какой разделитель, и номер столбца где находится поле по которому ищем
   Alex_Alexsin_2020
 
54 - 03.05.21 - 14:02
+(53) а так же имена столбцов которые имеются в файле
   evgpinsk_
 
55 - 08.05.21 - 09:56
(53) Вопрос ко мне?
Разделитель и поле поиска ведь может быть любым, это большого влияния на суть задачи не оказывает
   ptiz
 
56 - 08.05.21 - 10:24
(16) Зачем тебе "из Excel в DBF", если можно из твоего файла сразу dbf создать средствами 7.7?
   evgpinsk_
 
57 - 08.05.21 - 10:51
(56) Как именно?
   ptiz
 
58 - 08.05.21 - 15:41
(57) А в чем затык? Чтение текста - через СоздатьОбъект("ADODB.Stream"). DBF создается с помощью СоздатьОбъект("XBase").
   Кирпич
 
59 - 08.05.21 - 15:53
(57) Найди программиста и он тебе за часик сделает. Много денег не возьмет. Только не спрашивай, где искать программиста.
   evgpinsk_
 
60 - 08.05.21 - 15:59
(56) Не очень красиво построчно читать и заносить в dbf. 700 тыс позиций и 185 столбцов не очень быстро отрабатываются
 
 
   trdm
 
61 - 08.05.21 - 16:06
Сделал бы уже и забыл.
   evgpinsk_
 
62 - 08.05.21 - 16:13
Да и на этом большом файле вываливается 1с:
https://prnt.sc/12od0q9

где-то после 50тыс строк
   acanta
 
63 - 08.05.21 - 16:14
64536? размерность поля номер строки в ДБФ
   evgpinsk_
 
64 - 08.05.21 - 16:15
(63) Нет. 48806 строк записалось. И затем ошибка
   acanta
 
65 - 08.05.21 - 16:19
А сколько гигабайтов?
   evgpinsk_
 
66 - 08.05.21 - 16:22
(65) 256Мб если CSV файл
этот же файл, сохранённый в xlsx - 91МБ
   acanta
 
67 - 08.05.21 - 16:25
какие поля по размеру в ДБФ и сколько получилось в записанном ДБФ файле?
   Кирпич
 
68 - 08.05.21 - 16:26
(66) Выложи файлик куда нибудь. Я тебе запилю конвертер. Один хрен дождь льёт весь день.
   Кирпич
 
69 - 08.05.21 - 16:27
(66) А чо ты через excel не сохраняешь?
   evgpinsk_
 
70 - 08.05.21 - 16:28
(67) В зависимости от количества столбцов, которые читаю. Т.е. ограничение идёт на размер самого dbf файла.
На момент возникновения ошибка файл процесса 1с занимает 1гб в оперативной памяти
   acanta
 
71 - 08.05.21 - 16:30
ДБФ может записывать на диск сразу построчно, зачем в памяти?
   evgpinsk_
 
72 - 08.05.21 - 16:30
(69) Насколько я понимаю: Ексель не сохраняет в dbf. До 2007 офиса сохранял, но он до 65к строк только умел читать
   Кирпич
 
73 - 08.05.21 - 16:31
(62) А ты всё то не тащи в dbf. Только код(ну по чем искать потом) и номер строки в файле. Потом ищешь по коду в маленькой dbf и переходишь на нужную строку в файле.
   Кирпич
 
74 - 08.05.21 - 16:32
файл читай через ADO (там даже драйвер для csv должен быть)
   evgpinsk_
 
75 - 08.05.21 - 16:33
(73) Но почему ошибка при больших объёмах чтения всё-таки вылазит? Ради интереса понять. Вот код:
https://prnt.sc/12odpon
   evgpinsk_
 
76 - 08.05.21 - 16:33
(74) Я и читаю через ADO, правда читаю xlsx но это не важно
   trdm
 
77 - 08.05.21 - 16:34
(62) Скинь плз файло на почту, поиграюсь...
   Кирпич
 
78 - 08.05.21 - 16:35
(75) нахрен там чота понимать. это всё никому не нужное. надо задачу решать
   H A D G E H O G s
 
79 - 08.05.21 - 16:36
Ну 2 Гб файл превысил или сколько там на dbf ?
   evgpinsk_
 
80 - 08.05.21 - 16:36
   evgpinsk_
 
81 - 08.05.21 - 16:36
(79) так CSV файл текстом идёт всего 250Мб
   evgpinsk_
 
82 - 08.05.21 - 16:37
(73) Да, такой вариант можно реализовать
   acanta
 
83 - 08.05.21 - 16:37
   H A D G E H O G s
 
84 - 08.05.21 - 16:37
(81) Там в dbf поля фиксированной длины и на них ты получишь избыточность
   trdm
 
85 - 08.05.21 - 16:37
(75) Не стоит так делать, надо делать 2 dbf-ки, одну со структурой
code_t,code_m,prise
другую
code_m,title_m
   trdm
 
86 - 08.05.21 - 16:38
(84) ++
   H A D G E H O G s
 
87 - 08.05.21 - 16:39
Вы какой-то шлабудой занимаетесь.
   trdm
 
88 - 08.05.21 - 16:48
+(85) а, нет, посложнее нужна структурка, но смысл тот же.
   trdm
 
89 - 08.05.21 - 16:49
в зависимости от требуемой аналитики. но ничего сложного.
   evgpinsk_
 
90 - 08.05.21 - 16:52
(84) Понял.
(85) А в чём плюс двух файлов?
   trdm
 
91 - 08.05.21 - 16:53
(90) Нормализация базы данных. погугли.
   evgpinsk_
 
92 - 08.05.21 - 16:54
Два файла только решить проблему размера dbf файла на 2Gb и всё? Скорость чтения ведь будет одинакова
   trdm
 
93 - 08.05.21 - 17:00
это от задачи зависит. понятия не имею, какая тетализация нужна.
   hhhh
 
94 - 08.05.21 - 17:41
(92) ну 700 тыс строк - это детский сад, мизер, там максимум 1 GB дотянешь, и то чисто теоретически.
   Кирпич
 
95 - 08.05.21 - 18:13
(92) вот наговнокодил https://cloud.mail.ru/public/kbdr/R2Wz7Nays
там exe и исходники
кидаешь на csv2id.exe csv файл и рядом появляется маленький csv, в котором id товара и его смещение в большом csv
юзай этот маленький csv как хошь. хоть в dbf хоть куда. А большой читай через ADO Stream
   H A D G E H O G s
 
96 - 08.05.21 - 18:18
(95) Ну елки - палки. Ну и где интерфейс?
   H A D G E H O G s
 
97 - 08.05.21 - 18:24
1) bulk insert в таблицу SQL NewData
2) Сравнение с таблицей OldData
3) Дельту в таблицу DiffData
4) Удаление таблицы OldData
5) Переименование таблицы NewData в OldData
   evgpinsk_
 
98 - 08.05.21 - 18:36
Подскажите ещё, туплю и не могу понять как правильно создавать индексный файл?
В чём отличие команд "ДобавитьИндекс" и "СоздатьИндексныйФайл"?

Как нужно исправить код :
    ДБФ = СоздатьОбъект("xbase");        
    ДБФ.ДобавитьПоле("KodOnliner","S",20,1);    
    ДБФ.ДобавитьПоле("minCost","N",12,2);    
    ДБФ.ДобавитьИндекс("KodOnliner", "NAME",1,0,0);
    ДБФ.СоздатьФайл("d:\33.dbf","d:\33.cdx");

недокументированная ошибка вылазит
   evgpinsk_
 
99 - 08.05.21 - 18:41
(95) Мне наверное будет проще в 1с в цикле чтения CSV файла писать данные в два отдельных DBF файла. В одном будет id товара, а в другом его цены.
Лимит в 2гб не получу
   evgpinsk_
 
100 - 08.05.21 - 18:44
(98) С ошибкой разобрался, в последнем параметре была :
ДБФ.ДобавитьИндекс("KodOnliner", "NAME",1,0,"");
  1  2  3  4   

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.