|
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
|
||||
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) ну надо же, как просто-то! :)
большое тебе, человеческое спасибо! |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |