Чисто гипотетически !

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Constantine
Активист
Сообщения: 148
Зарегистрирован: 07 Февраль 2017, 16:58

Чисто гипотетически !

Сообщение Constantine » 19 Июнь 2019, 10:40

finsoftrz писал(а):
19 Июнь 2019, 10:38
Фишка в том, что с точки зрения приложения это все скрыто в классе.
А класс-то откуда взялся?

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4320
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Чисто гипотетически !

Сообщение Игорь Столяров » 19 Июнь 2019, 10:40

Constantine писал(а):
19 Июнь 2019, 10:36
были проблемы с Win1251
Так Вы патриот … ;) Но дело в том, что в Clarion XML нет проблем с Win1251, я это уже несколько раз рассказывал …
Загружаем XML в строку, заменяем "Win1251" на "UTF-8", конвертим строку в UTF-8 и распарсиваем её … Проверено десятки раз. :)
«V» значит Вендетта !

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1393
Зарегистрирован: 06 Ноябрь 2014, 12:48

Чисто гипотетически !

Сообщение finsoftrz » 19 Июнь 2019, 10:42

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

Constantine
Активист
Сообщения: 148
Зарегистрирован: 07 Февраль 2017, 16:58

Чисто гипотетически !

Сообщение Constantine » 19 Июнь 2019, 10:48

Игорь Столяров писал(а):
19 Июнь 2019, 10:40
Загружаем XML в строку, заменяем "Win1251" на "UTF-8", конвертим строку в UTF-8 и распарсиваем её …
И так сто миллионов раз для файла в пару сотен Мб... :-)
О быстродействии можно забыть...

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4320
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Чисто гипотетически !

Сообщение Игорь Столяров » 19 Июнь 2019, 10:52

Constantine писал(а):
19 Июнь 2019, 10:48
О быстродействии можно забыть...
С точностью - до наоборот. Здесь всего одна файловая операция - загрузка в строку.
Даже если делать это тупо через драйвер Clarion - это быстро, а через WinAPI - на порядок быстрей.
Далее все манипуляции в RAM. Ну для примера, достаточно сложный XML на 50 MByte парсится так 3-4 секунды.
(если у Вас конечно не первый из выпущенных ноутбуков … ;) )
Последний раз редактировалось Игорь Столяров 19 Июнь 2019, 10:53, всего редактировалось 1 раз.
«V» значит Вендетта !

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1393
Зарегистрирован: 06 Ноябрь 2014, 12:48

Чисто гипотетически !

Сообщение finsoftrz » 19 Июнь 2019, 10:53

Constantine писал(а):
19 Июнь 2019, 10:40
finsoftrz писал(а):
19 Июнь 2019, 10:38
Фишка в том, что с точки зрения приложения это все скрыто в классе.
А класс-то откуда взялся?
А вот это один раз делать надо... Бывают, конечно, более сложные ситуации, чем просто загрузка в очередь или группу. Например, вложенные структуры с повторяющимися тэгами. Тогда немного ручками приходится поработать. Находим в сети пример скрипта и пишем что-то наподобии приведенного ниже фрагмента. Результат все равно в очередь. Пример, кстати, рабочий. Использует xPath.

Код: Выделить всё

readMarka_r  routine
   DATA
lor:queueMarka queue, pre()  !марки
lor:numBoxM    like(DEdiM:NumBox),     name('box')
lor:alcoCodeM  like(DEdiM:AlcoCode),   name('alcocode')
lor:spraM      like(DEdiM:IDSpravkaA), name('spra')
lor:sprbM      like(DEdiM:IDSpravkaB), name('sprb')
lor:sprbrM     like(DEdiM:IDSpravkaBReg), name('sprbr')
lor:markaM     like(DEdiM:AlcoPDF),    name('marka')
.
  CODE

     fsXmlPar.init(Loc:NameTmp,Loc:NameVbsTmp,Loc:NameOutTmp)
     fsXmlPar.EgaisNameSpace(3,0)
     fsXmlPar.LoadQueueHand('lor:queueMarka',lor:queueMarka)  !строки накладной
     fsXmlPar.AddScriptInt('Set NodeList = Root.SelectNodes("//ns:Document/ns:WayBill_v3/wb:Content/wb:Position")')
     fsXmlPar.AddScriptInt('For Each Elem In NodeList')
     fsXmlPar.AddScriptInt('   SET per = Elem.SelectSingleNode("wb:Identity")')
     fsXmlPar.AddScriptInt('   sprbr = per.text')
     fsXmlPar.AddScriptInt('   SET per = Elem.SelectSingleNode("wb:Product/pref:AlcCode")')
     fsXmlPar.AddScriptInt('   alcocode = per.text')
     fsXmlPar.AddScriptInt('   SET per = Elem.SelectSingleNode("wb:FARegId")')
     fsXmlPar.AddScriptInt('   spra = per.text')
     fsXmlPar.AddScriptInt('   SET per = Elem.SelectSingleNode("wb:InformF2/ce:F2RegId")')
     fsXmlPar.AddScriptInt('   sprb = per.text')
     fsXmlPar.AddScriptInt('   Set NodeList2 = Elem.SelectNodes("wb:InformF2/ce:MarkInfo/ce:boxpos")')
     fsXmlPar.AddScriptInt('   For Each Elem2 In NodeList2')
     fsXmlPar.AddScriptInt('      SET per = Elem2.SelectSingleNode("ce:boxnumber")')
     fsXmlPar.AddScriptInt('      if not per is Nothing then')
     fsXmlPar.AddScriptInt('         numBox = per.text')
     fsXmlPar.AddScriptInt('      end if')
     fsXmlPar.AddScriptInt('      Set NodeList3 = Elem2.SelectNodes("ce:amclist/ce:amc")')
     fsXmlPar.AddScriptInt('      For Each Elem3 In NodeList3')
     fsXmlPar.AddScriptInt('         marka = Elem3.text')
     fsXmlPar.AddScriptInt('         outFile.WriteLine "box=" & numBox')
     fsXmlPar.AddScriptInt('         outFile.WriteLine "alcocode=" & alcocode')
     fsXmlPar.AddScriptInt('         outFile.WriteLine "spra=" & spra')
     fsXmlPar.AddScriptInt('         outFile.WriteLine "sprb=" & sprb')
     fsXmlPar.AddScriptInt('         outFile.WriteLine "sprbr=" & sprbr')
     fsXmlPar.AddScriptInt('         outFile.WriteLine "marka=" & marka')
     fsXmlPar.AddScriptInt('         outFile.WriteLine "@add"')
     fsXmlPar.AddScriptInt('      Next')
     fsXmlPar.AddScriptInt('   Next')
     fsXmlPar.AddScriptInt('Next')
     fsXmlPar.AddScriptInt('Set NodeList = Nothing')
     fsXmlPar.AddScriptInt('Set NodeList2 = Nothing')
     fsXmlPar.AddScriptInt('Set NodeList3 = Nothing')
     fsXmlPar.AddScriptInt('')
     fsXmlPar.MakeScript(1)
     if fsXmlPar.ErrorCode<>0
        FsMessagePr('Ошибка! ' & clip(fsXmlPar.ErrorMessage))
        lor:err=1
     .
     fsXmlPar.kill
Рязань решает.

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1393
Зарегистрирован: 06 Ноябрь 2014, 12:48

Чисто гипотетически !

Сообщение finsoftrz » 19 Июнь 2019, 10:57

Операции с файлами, конечно, через win api...
Рязань решает.

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4320
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Чисто гипотетически !

Сообщение Игорь Столяров » 19 Июнь 2019, 11:00

finsoftrz писал(а):
19 Июнь 2019, 10:57
Операции с файлами, конечно, через win api
Конечно ! А как иначе получить неповторимое удовольствие от скорости работы с файлами ? ;)
«V» значит Вендетта !

Constantine
Активист
Сообщения: 148
Зарегистрирован: 07 Февраль 2017, 16:58

Чисто гипотетически !

Сообщение Constantine » 19 Июнь 2019, 11:04

finsoftrz писал(а):
19 Июнь 2019, 10:53
fsXmlPar
Все равно не понял. Это что? Класс? Откуда он взялся?

Constantine
Активист
Сообщения: 148
Зарегистрирован: 07 Февраль 2017, 16:58

Чисто гипотетически !

Сообщение Constantine » 19 Июнь 2019, 11:05

Игорь Столяров писал(а):
19 Июнь 2019, 10:52
Здесь всего одна файловая операция - загрузка в строку
Т.е. все 50 Мб - в одну строку?
STRING или CSTRING?

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4320
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Чисто гипотетически !

Сообщение Игорь Столяров » 19 Июнь 2019, 11:18

Constantine писал(а):
19 Июнь 2019, 11:05
STRING или CSTRING?
Да. Либо вручную создать динамическую строку New() нужного размера, либо использовать
штатный класс Clarion для работы с динамическими строками IDynStr и не париться с размером вообще …
А что удивительного в строке размером 50 MByte ? Меня же не удивляет, что Вы планируете это делать "сто миллионов раз" … ;)
Последний раз редактировалось Игорь Столяров 19 Июнь 2019, 11:19, всего редактировалось 1 раз.
«V» значит Вендетта !

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2322
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Чисто гипотетически !

Сообщение Дед Пахом » 19 Июнь 2019, 11:19

Может в чат перейти?
app.php/chat
С уважением, ДП

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4320
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Чисто гипотетически !

Сообщение Игорь Столяров » 19 Июнь 2019, 11:21

Дед Пахом писал(а):
19 Июнь 2019, 11:19
Может в чат перейти?
Намёк понял и ушёл на обед. :)
«V» значит Вендетта !

Constantine
Активист
Сообщения: 148
Зарегистрирован: 07 Февраль 2017, 16:58

Чисто гипотетически !

Сообщение Constantine » 19 Июнь 2019, 11:26

Игорь Столяров писал(а):
19 Июнь 2019, 11:18
А что удивительного в строке 50 MByte ?
Удивительного ничего нет. Просто, в С6 STRING максимум 4 М.б. CSTRING - можно больше через NEW. Уже разница.
И потом: ну, конвертировал я эту строку в 50 Мб в UTF-8, получил ее в такую же переменную. А дальше ее опять на диск записывать уже в UTF-8?

Yufil
Ветеран движения
Сообщения: 1170
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

Чисто гипотетически !

Сообщение Yufil » 19 Июнь 2019, 11:57

Надо поискать по ключевому слову FillDomQueue, там разные примеры использования стандартного XML парсера. На диск писать не надо, строка в UTF-8 передаётся парсеру непосредственно. Но результаты парсинга тоже получаются в UTF-8, их надо в ASCII перегонять.

Ответить