Как в 1С обрабатывать длинные строки (4 Мб)

1. Kutuzov 744 27.10.14 12:07 Сейчас в теме
Столкнулся с проблемой, что большие строки в 1С очень долго обрабатываются. Например, вот этот алгоритм ищет все точки запятые в кавычках и заменяет на запятые.

СтрокаТекстаРезультат = "";
	Кавычка = Ложь;
	Для НомерСимвола = 1 По СтрДлина(СтрокаТекста) Цикл
		ТекСимвол = Сред(СтрокаТекста,НомерСимвола,1);
		Если ТекСимвол = """" Тогда
			Кавычка = НЕ(Кавычка);
		КонецЕсли;
		Если ((ТекСимвол = ";") ИЛИ (ТекСимвол = Символы.ПС)) И Кавычка Тогда
			ТекСимвол = ",";
		КонецЕсли;
		СтрокаТекстаРезультат = СтрокаТекстаРезультат + ТекСимвол;
	КонецЦикла;
	Возврат(СтрокаТекстаРезультат);
Показать


На файле размером 4 Мб работает несколько часов. Кто сталкивался с подобной проблемой?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
13. ildarovich 7893 27.10.14 19:45 Сейчас в теме
(1) Kutuzov, в статье "Опять двойка" есть описание и обсуждение этой проблемы. И объяснение ее природы. В комментарии http://forum.infostart.ru/forum24/topic75023/message908183/#message908183 приведен код для использования ЗаписьXML. Это действительно самый быстрый способ.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
8. insurgut 207 27.10.14 12:53 Сейчас в теме
Самое интересное - скорость обработки возрастает не линейно, а в прогрессии.

Кстати. А вариант в вашем случае отрабатывает практически мгновенно:

	Сообщить("Начало 3:" + ТекущаяДата());
	ТекстДок = Новый ТекстовыйДокумент;
	ТекстДок.Прочитать("c:\upload\1.txt");
	СтрокаТекста = ТекстДок.ПолучитьСтроку(1);
	СтрокаТекстаРезультат = СтрЗаменить(СтрокаТекста, ";", ",");
	СтрокаТекстаРезультат = СтрЗаменить(СтрокаТекстаРезультат, """" + Символы.ПС + """", ",");
	Сообщить(СтрокаТекстаРезультат);
    Сообщить("Конец 3:" + ТекущаяДата());
13. ildarovich 7893 27.10.14 19:45 Сейчас в теме
(1) Kutuzov, в статье "Опять двойка" есть описание и обсуждение этой проблемы. И объяснение ее природы. В комментарии http://forum.infostart.ru/forum24/topic75023/message908183/#message908183 приведен код для использования ЗаписьXML. Это действительно самый быстрый способ.
14. Kutuzov 744 28.10.14 14:37 Сейчас в теме
(13) ildarovich, спасибо, век живи - век учись!
15. Serginio 940 28.10.14 17:37 Сейчас в теме
(14) А что тебе во 2 ответе не понравилось?
2. Serginio 940 27.10.14 12:15 Сейчас в теме
Для слияния строк используй ЗаписьXML ЗаписатьБезОбработки

http://www.forum.mista.ru/topic.php?id=689081#25
ildarovich; +1 Ответить
3. insurgut 207 27.10.14 12:29 Сейчас в теме
А зачем на каждом шаге цикла:
Для НомерСимвола = 1 По СтрДлина(СтрокаТекста) Цикл

Требуется вычислять длину СтрокаТекста?
Может так корректнее?
нДлина = СтрДлина(СтрокаТекста);
Для НомерСимвола = 1 По нДлина Цикл
10. PetroP 27.10.14 15:28 Сейчас в теме
(3) Это в Пока-цикле вычисляется каждый обход, в Для-цикле - лишь один раз.
4. spezc 787 27.10.14 12:35 Сейчас в теме
как вариант использовать ЧтениеТекста - читать и обрабатывать файл построчно
5. Kutuzov 744 27.10.14 12:38 Сейчас в теме
(4) spezc, не годится, т.к. в кавычках может оказаться и символ перевода строки, который тоже необходимо обработать - заменить на запятую.
6. insurgut 207 27.10.14 12:41 Сейчас в теме
(5) Kutuzov, как в строке появится символ переноса строки? Это уже другая строка будет :)
7. Serginio 940 27.10.14 12:46 Сейчас в теме
Да и добавлять лучше не по одному элементу а сразу копировать диапазон
Например
http://www.forum.mista.ru/topic.php?id=560193#1
9. Serginio 940 27.10.14 12:56 Сейчас в теме
Но вообще для твоего алгоритма достаточно
Стр=СтрЗаменить(Стр,""";",""",");
Стр=СтрЗаменить(Стр,""""+Символы.ПС,""",");
11. and_sk 14 27.10.14 15:31 Сейчас в теме
про фоновые процессы была недавно статья, разбить куски и распараллелить
12. PetroP 27.10.14 15:32 Сейчас в теме
В условиях в первую очередь надо ставить такое, что отрабатывается всегда и быстро. Т. е. не:
Если ((ТекСимвол = ";") ИЛИ (ТекСимвол = Символы.ПС)) И Кавычка Тогда

а:
Если Кавычка И ((ТекСимвол = ";") ИЛИ (ТекСимвол = Символы.ПС)) Тогда


P.S.: это не решение проблемы, а так, небольшая оптимизация.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот