Имя: Пароль:
1C
1C 7.7
v7: Манипуляции с большими текстами
0 andrewks
 
02.09.11
16:52
допустим, дано следующее:

есть входной файл, текстовый, в произвольной кодировке (кодировку мы знаем заранее), с очень большими строками, манипуляции с которыми в 7.7 невозможны.
есть некий перечень манипуляций, которые надо проделать с этим текстом, для простоты давайте будем рассматривать таблицу замен, т.е., например, ТЗ с двумя колонками: СтрПоиска,СтрЗамены. эти строки небольшие, ими можно оперировать в 7.7
результат (т.е. текст с учётом манипуляций) выгоняем в выходной файл

чтение/запись организовал посредством ADODB.Stream.

вопрос:  как оптимально реализовать манипуляции, не валя 7-ку?
1 Ёпрст
 
02.09.11
16:56
тупо слепить всё через fso
2 Ёпрст
 
02.09.11
16:56
одно файло читаем во второе пишем, всё собственно
3 andrewks
 
02.09.11
16:57
(1) а евонные строки никак не ограничены алгоритмически по длине?
4 andrewks
 
02.09.11
16:57
(2) да не, не всё. нужно манипулировать строками в 1сине
5 Ёпрст
 
02.09.11
16:58
(3) как-то даже не задумывался.
жувал он гиговое файло вполне нормально.
6 Господин ПЖ
 
02.09.11
16:59
дергая vbs скрипт например который все сделает внутри себя
7 andrewks
 
02.09.11
16:59
хорошо, можешь тогда развернуть "слепить всё через fso"? имеешь в виду в скрипте всё сделать?
8 Попытка1С
 
02.09.11
17:00
"с очень большими строками, манипуляции с которыми в 7.7 невозможны. "

напрашивается вывод делать это не в 7.7
9 Попытка1С
 
02.09.11
17:01
+ да и собственно вообще не в 1с как вариант
10 filh
 
02.09.11
17:01
если нужен только поиск+замена, разбивай строки на подстроки с перекрещиванием на ДлинаСтр(СтрПоиска)/2+1. Ну и делай поиск СтрПоиска в подстроках.
11 Господин ПЖ
 
02.09.11
17:01
>жувал он гиговое файло вполне нормально.

проблема не в объеме, а в длине строки поддержаваемой 1С
12 andrewks
 
02.09.11
17:02
киньтесь примером, если не сложно
и есть ли вариант без скриптов сделать?
например, есть ли функции поиска/замены и т.п. для стрима?

понимаю, что нужно выносить за 1с
13 andrewks
 
02.09.11
17:02
(10) хрень получается. пол-часа щас голову ломал, но устойчивого алгоритма так и не накидал
14 Ёпрст
 
02.09.11
17:02
(7) да.
15 Господин ПЖ
 
02.09.11
17:03
>например, есть ли функции поиска/замены и т.п. для стрима?

каждый должен заниматься своим делом...
16 andrewks
 
02.09.11
17:04
(15) в стриме нет, это понятно. я имею в виду другие объекты, которые могут принять текстовый стрим и манипулировать им
17 Господин ПЖ
 
02.09.11
17:07
зачем объекты? проблема в типах данных которые поддерживает 1с. у тебя данные выходят за их возможности. П.э. надо кромсать данные, или вообще манипулировать ими на пределами 1С.
18 filh
 
02.09.11
17:07
(13) читай файл блоками. Длина блока от Макс(СтрПоиска)+1 до ...
1. Считал блок = ДлинаСтр(СтрПоиска)/2+1.
2. Считал остальное до ДлинаБлока.
3. Произвел поиск + замену
4. Записал a файло.
5. от конца блока взял ДлинаСтр(СтрПоиска)/2+1 символов.
6. гото 2
как то так.
19 andrewks
 
02.09.11
17:09
(17) я это и хочу. например, типа того:

Obj1=CreateObject("StrObj1");
Obj1.ReplaceAll(TxtStream,СтрПоиска,СтрЗамены);
20 Господин ПЖ
 
02.09.11
17:11
(19) напиши консольку на c# - будет... только накуа...

нарисуй скрипт - передавай в него имя файла, обратно результат.
21 andrewks
 
02.09.11
17:16
я как раз от fso отказался, потому что он мало кодировок знает, и не умеет конвертировать из потока в поток. пришел к
ADODB.Stream.

упёрлось всё в ограниченность 1совского стринга
22 Cthulhu
 
02.09.11
17:17
а в цифрах кто-нибудь сможет озвучить "ограничение 1с"?..
23 Господин ПЖ
 
02.09.11
17:17
ADODB.Stream кагбэ пофиг откуда его вызывают...
24 andrewks
 
02.09.11
17:19
(22) точно не замерял, но мег уже не держит, вываливается с руганью на mfc42
25 Cthulhu
 
02.09.11
17:29
(24): странно. лопатил точно по два мульёна (+) символов - и ничего...
так что вопрос (22) ждет ответа...
26 andrewks
 
02.09.11
17:54
(18) с блоками не получается алгоритма, устойчивого к входным данным

(25) хз, может, зависит от оси
сейчас затестил на Win2k3 x64: 2,1 Мб кушает, на 2,6 Мб уже валится Вызвано исключение c00000fd по адресу 755C52A3 (MFC42!Ordinal6432)
27 trdm
 
02.09.11
18:44
(0) andrewks >> вопрос:  как оптимально реализовать манипуляции, не валя 7-ку?

посмотри скрипты опенконфа, там много работы с текстами.
+ http://script-coding.com/wsh_chm.zip
+ https://1cers.ru/topics_by_tag.php?tag_id=38
28 Torquader
 
02.09.11
21:39
FileSystemObject позволяет читать файл побайтно, то есть можно написать поисковик, который вообще памяти не занимает.
Проблема в 1С только в том, что нет возможности записывать нулевые символы (читать-то их побайтно можно).
Поэтому, всё равно придётся скрипт писать, а вот скрипт умеет жевать очень большие файлы - он у меня образ диска из файла 8 гигов пересобирал, и, надо сказать, не сильно-то и тормозил.
29 andrewks
 
05.09.11
23:44
короче, загнал всё в ява-скрипт, всё шуршит, как надо.

последняя проблемка осталась - если объём строк очень большой, вылазит вот такая шняга:
http://savepic.org/2262316.png

если нажать Continue, отрабатывает скрипт дальше, корректно.
как избавится?
30 Господин ПЖ
 
05.09.11
23:48
надо управлять тайм-аутом...

http://www.autohotkey.com/forum/topic21674-135.html
31 andrewks
 
06.09.11
00:01
(30) а для JS случайно не завалялся примерчик?

в поиске только реестр править советуют, а здесь финт красивый, только не соображу, как его на JS изобразить
32 smaharbA
 
06.09.11
01:07
К=0;
Пока Стрим.EOS=0 Цикл
   З=Стрим.ReadText(1);
   Х=Х+З;
   Если З=Сред(ЧеНадо,К,1) Тогда
       К=К+1;
       Если Х=ЧеНадо Тогда
           Пишем(Х,Файл);
           Х="";
           К=0;
       КонецЕсли;
   ИначеЕсли СтрДлина(Х)=СтрДлина(ЧеНадо) Тогда
       Х="";
       К=0;
       Стрим.position=Стрим.position - СтрДлина;
       Пишем(Стрим.ReadText(1),Файл);
   КонецЕсли;
КонецЦикла;

Ну очень не спешно
(как то так)
33 smaharbA
 
06.09.11
01:23
и строка в адинес вполне удержит мег 100, если надо наверняка и много, используй переменные из обертки
34 Cthulhu
 
06.09.11
01:26
(33): а что такое "переменная из обертки"?
35 smaharbA
 
06.09.11
01:29
(34) использовать ком объект в качестве "хранилища"
htmlfile или msscriptcontrol
36 Cthulhu
 
06.09.11
01:45
(35): опа. а пример попроще (и не торомозной)?.. со считыванием и простейшим парсингом (типа найти вхождение строки - обрезать - и т.п)?..
37 Cthulhu
 
06.09.11
01:46
(36)+: и - да, важный вопрос. какую службу нужно в терминальную сессию для этого всовывать?..
38 smaharbA
 
06.09.11
02:07
И еще - лучче читать и стрим по строкам
ReadText(-2)

А пример будет вполне тормозной, правдо можно спокойно реализовать и асинхронность замены
39 andrewks
 
06.09.11
08:05
(33) строка в адинэс лично у меня больше 2,5 мег не держит, см (26)

ты лучше подскажи, как тайм-аут по человечьи в JS обойти ;-)
40 andrewks
 
06.09.11
08:06
(38) по строкам и читаю. фишка в том, что в одной строке может быть  и 10 метров.
41 smaharbA
 
06.09.11
12:42
(39)
.Timeout=-1
42 andrewks
 
06.09.11
14:26
(41) ну надо же, как просто-то! :)

большое тебе, человеческое спасибо!
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн