|
v7: Сохранить большой текст в файл - молча вылетает | ☑ | ||
---|---|---|---|---|
0
серый КТУЛХУ
08.12.21
✎
04:24
|
//СтрДлина(ТекстЖсон) = 6058631
Стрим = СоздатьОбъект("ADODB.Stream"); Стрим.Type=2; Стрим.charset="windows-1251"; Стрим.Open(); Стрим.WriteText(ТекстЖсон); // 1с-ина тихо сворачивается в коврик ((( Стрим.SaveToFile(ФайлЖсон,2); Стрим.Close(); Стрим = 0; ... в принципе могу пропарсить этот текст - но это тааак медленно... от сорока минут и больше дето... может как-то еще можно извернуться, а, люди? |
|||
1
серый КТУЛХУ
08.12.21
✎
04:46
|
таблин. если побить на куски при выводе - Ок. НО!
при попытке скриптом распарсить этот жсон - тоже тупо сворачивается в коврик: scriptCtrl = СоздатьОбъект("MSScriptControl.ScriptControl"); scriptCtrl.Language="jscript"; код = " | | function parseJSON(strJSON) { | var tmpFunc = (new Function('return('+strJSON+');'))(); | return(tmpFunc); | } | | // Получить элемент массива | function aGet(Array, index) { | return(Array[index]); | } | | // Получить ключ пары по индексу | function oKey(Obj, index) { | var size = 0, key; | for (key in Obj) { | if (size == index) break; | if (Obj.hasOwnProperty(key)) size++; | } | return(key); | } | | // Получить значение пары по ключу | function oValueByKey(Obj, key) { | return(Obj[key]); | } | | //Получить количество пар в объекте | Object.size = function(obj) { | var size = 0, key; | for (key in obj) { | if (obj.hasOwnProperty(key)) size++; | } | return(size); | } | | //Получить размер объекта (количество пар в нём) | function oSize(Obj) { | return(Object.size(Obj)); | } | | // Получить тип объекта (number, string, object, array) | function eType(Element) { | if (Element instanceof Array) { | return(""array""); | } else if (Object.prototype.toString.call(Element) === '[object Array]') { | return(""array""); | } else { | return(typeof(Element)); | } | } |"; scriptCtrl.AddCode(код); Рез = scriptCtrl.run("parseJSON", ТекстЖсон ); // тут тихо ложится... |
|||
2
Aleksey
08.12.21
✎
05:41
|
рекомендую сохранить его кусками по 1000 строк. Так больше чем на порядок быстрее.
А если очень нужно на выходе один большой файл, то можно его слить средствами винды т.е. после выгрузки "кусков" КомандаСистемы("copy d:\0\*.tmp d:\0\Data.json"); КомандаСистемы("del d:\0\*.tmp /f /q"); |
|||
3
Aleksey
08.12.21
✎
05:42
|
Тогда средствами винды копируем все наши куски в один файл и после этого подчищаем за собой
|
|||
4
Salimbek
08.12.21
✎
07:33
|
(0) Попробуйте BinaryData из 1С++ (если религия позволяет)
|
|||
5
Salimbek
08.12.21
✎
07:34
|
||||
6
Злопчинский
08.12.21
✎
11:10
|
клюшки в строковой переменой ограничена 32Кб
может поэтому вылетает |
|||
7
серый КТУЛХУ
08.12.21
✎
11:22
|
я прошу прощния, выгрузить уже ПОЛУЧИЛОСЬ "порциями":
Стрим = СоздатьОбъект("ADODB.Stream"); Стрим.Type=2; Стрим.charset="windows-1251"; Стрим.Open(); //Стрим.WriteText(ТекстЖсон); // вылетает по памяти Порция = 100000; КвоПорций = СтрДлина(ТекстЖсон)/Порция; КвоПорций = Цел(КвоПорций) + ?(КвоПорций=Цел(КвоПорций),0,1); Для СчетчикПорций = 1 По КвоПорций Цикл НачПоз = 1+(СчетчикПорций-1)*Порция; Стрим.WriteText(Сред(ТекстЖсон,1+(СчетчикПорций-1)*Порция,Порция)); КонецЦикла; Стрим.SaveToFile(ФайлЖсон,2); Стрим.Close(); Стрим = 0; теперь вылетает при попытке парсинга json - см.(2). вроде нашел обсуждение такое же - но без результата - Парсинг JSON |
|||
8
acht
08.12.21
✎
11:28
|
Цель-то какая у этих подергиваний из памяти на диск - с диска в память?
В теме явно было "Сохранить большой текст в файл", сейчас уже парсинг откуда-то взялся... |
|||
9
acht
08.12.21
✎
11:30
|
Тебе надо разобрать строку, которая лежит в переменной 1C ТекстЖсон и у которой длина 6058631 символов?
|
|||
10
acht
08.12.21
✎
11:33
|
Ну так не заводи ее в переменные 1С вообще. Сделай обертку на MSScriptControl.ScriptControl и проведи вообще всю обработку внутри его, начиная от получения данных. В 1С отдашь только результат, попиленный на маленькие переменные.
|
|||
11
Salimbek
08.12.21
✎
14:12
|
(1) А что у вас должно получиться в переменной Рез в итоге?
|
|||
12
серый КТУЛХУ
08.12.21
✎
14:24
|
(11) распарсенный в СЗ жсон:
представление - имя параметра, значение - ясночто. массивы - в виде ТЗ с колонкой "Значение" |
|||
13
серый КТУЛХУ
08.12.21
✎
14:25
|
(10): не силен в жскриптинге ((
|
|||
14
серый КТУЛХУ
08.12.21
✎
14:30
|
ЗЫ: утащил с https://expert.chistov.pro/public/1167222/ парсинг жсона.
на ОбъектИзЖсон = ПреобразоватьJSON(ТекстЖсон,0); сворачивается тоже точнее - на вотетом: Класс = scriptCtrl.eval("JSON"); Объект = Класс.parse(Данные, ); //трындец снова |
|||
15
Salimbek
08.12.21
✎
14:44
|
(12) В вашем коде я не увидел ни создания ТЗ, ни создания СЗ. Поэтому с чего у вас такие ожидания были - непонятно.
(14) А вот тут создаются разные хранилища. Тут согласен с ожиданиями. А на коротком JSON (например из статьи) он отрабатывает нормально? |
|||
16
серый КТУЛХУ
08.12.21
✎
14:55
|
(15): в функции parseJSON при преобразовании строки в код JS автоматом получается объект json, который туда подставлен в виде строки..
странно но вылетает. сейчас еще поковыряюсь |
|||
17
серый КТУЛХУ
08.12.21
✎
15:40
|
(15):
Объект = scriptCtrl.eval("JSON.parse(strparam, '')"); {D:\TEST-002.ERT(738)}: Ошибка компиляции Microsoft JScript: Предполагается наличие идентификатора, строки или числа |
|||
18
trad
08.12.21
✎
15:52
|
семерка не может передавать ком-серверам (любым) длинные строки. Падает. Планка - несколько сотен килобайт. ТОчнее не помню
|
|||
19
серый КТУЛХУ
08.12.21
✎
15:55
|
(18): а как извратиться через файл?
|
|||
20
trad
08.12.21
✎
16:01
|
(19)
Текст = СоздатьОбъект("Текст"); Текст.ДобавитьСтроку(ТекстЖсон); Текст.Записать(); А в скрипте открываешь файл и читаешь |
|||
21
trad
08.12.21
✎
16:04
|
или использовать такую поделку
OleExSup = СоздатьОбъект("OleExSup"); Рез = OleExSup.ВызватьОЛЕМетод(Скрипт, "run", "parseJSON", ТекстЖсон); |
|||
22
Salimbek
08.12.21
✎
16:47
|
(21) А я еще вон чего нашел, но что там под капотом - не знаю )))
https://www.1cpp.ru/forum/YaBB.pl?num=1592377547 |
|||
23
trad
08.12.21
✎
17:16
|
(22) там старый КОП. С небольшими джесонами можно работать, т.к. посимвольный парсинг кодом 1с.
На больших уснешь ждать. |
|||
24
trad
08.12.21
✎
17:25
|
Вот новый
https://www.dropbox.com/s/pmpgyd068mzzu7k/kop1c_JSON.7z Там есть свойство ИспользоватьScriptControl |
|||
25
серый КТУЛХУ
08.12.21
✎
17:49
|
гляну спс.
да вроде жрет этот скрипт мой жсон. спасибо всем. |
|||
26
серый КТУЛХУ
08.12.21
✎
17:50
|
Парсинг текста ( длина = 5 923 254 ): затрачено секунд 208.4, Записей в результате (Таблица) = 9 257
|
|||
27
серый КТУЛХУ
08.12.21
✎
17:51
|
это скриптом. тот же самый жсон-текст 1с-ными инструментами парсился от получаса.
|
|||
28
ДедМорроз
08.12.21
✎
22:04
|
У тебя 7.7 в ней текст а строках однобайтовый.
Когда ты его даешь какому-то Com-серверу,то ему должен достаться двухбайтовый текст - это преобразование делает 1с перед тем как вызвать IDispatch этого объекта - и здесь у тебя кончается память. К сожалению,это обойти никак нельзя. |
|||
29
ДедМорроз
08.12.21
✎
22:07
|
Откуда ты это текст получил?
Может быть,его можно получить,минуя 1с,чтобы он был сразу 2 байта или использовать потоковое чтение. Например,объект Scripting.FileSystemObject и его TextStream в 32 битном варианте переваривал образы дисков,которые измерялись в терабайтах. |
|||
30
серый КТУЛХУ
09.12.21
✎
04:14
|
(29): с партнерского сайта по api - результат запроса на изменения справочников номенклатурных. у них в api не регламентируется объем, шо есть - то и нате жрите не обляпайтесь.
та не, сожрали скрипты от Чистова с инфостарта... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |