А класс-то откуда взялся?
Чисто гипотетически !
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Чисто гипотетически !
Так Вы патриот … Но дело в том, что в Clarion XML нет проблем с Win1251, я это уже несколько раз рассказывал …
Загружаем XML в строку, заменяем "Win1251" на "UTF-8", конвертим строку в UTF-8 и распарсиваем её … Проверено десятки раз.
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4615
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 37 раз
Чисто гипотетически !
Плюс визуализация - термометр, счетчик времени ожидания, кнопка прерывания. В самом приложении об этом не надо заботиться.
C6/C11, ШВС, tps/btrieve.
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
Чисто гипотетически !
И так сто миллионов раз для файла в пару сотен Мб...Игорь Столяров писал(а): ↑19 Июнь 2019, 10:40Загружаем XML в строку, заменяем "Win1251" на "UTF-8", конвертим строку в UTF-8 и распарсиваем её …
О быстродействии можно забыть...
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Чисто гипотетически !
С точностью - до наоборот. Здесь всего одна файловая операция - загрузка в строку.
Даже если делать это тупо через драйвер Clarion - это быстро, а через WinAPI - на порядок быстрей.
Далее все манипуляции в RAM. Ну для примера, достаточно сложный XML на 50 MByte парсится так 3-4 секунды.
(если у Вас конечно не первый из выпущенных ноутбуков … )
Последний раз редактировалось Игорь Столяров 19 Июнь 2019, 10:53, всего редактировалось 1 раз.
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4615
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 37 раз
Чисто гипотетически !
А вот это один раз делать надо... Бывают, конечно, более сложные ситуации, чем просто загрузка в очередь или группу. Например, вложенные структуры с повторяющимися тэгами. Тогда немного ручками приходится поработать. Находим в сети пример скрипта и пишем что-то наподобии приведенного ниже фрагмента. Результат все равно в очередь. Пример, кстати, рабочий. Использует 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
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Чисто гипотетически !
Конечно ! А как иначе получить неповторимое удовольствие от скорости работы с файлами ?
За теми кто отстал - не возвращаться. (С) Кодекс
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Чисто гипотетически !
Да. Либо вручную создать динамическую строку New() нужного размера, либо использовать
штатный класс Clarion для работы с динамическими строками IDynStr и не париться с размером вообще …
А что удивительного в строке размером 50 MByte ? Меня же не удивляет, что Вы планируете это делать "сто миллионов раз" …
Последний раз редактировалось Игорь Столяров 19 Июнь 2019, 11:19, всего редактировалось 1 раз.
За теми кто отстал - не возвращаться. (С) Кодекс
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
Чисто гипотетически !
Удивительного ничего нет. Просто, в С6 STRING максимум 4 М.б. CSTRING - можно больше через NEW. Уже разница.
И потом: ну, конвертировал я эту строку в 50 Мб в UTF-8, получил ее в такую же переменную. А дальше ее опять на диск записывать уже в UTF-8?
Чисто гипотетически !
Надо поискать по ключевому слову FillDomQueue, там разные примеры использования стандартного XML парсера. На диск писать не надо, строка в UTF-8 передаётся парсеру непосредственно. Но результаты парсинга тоже получаются в UTF-8, их надо в ASCII перегонять.