Имя: Пароль:
1C
 
Медленный разбор файла (Последовательный доступ к тексту)
,
0 serg999
 
31.10.21
11:37
Добрый день. Совет нужен, есть текстовый файл, надо из него вытащить вложение в двоичных данных.
Доступ стандартный, внутри разбор на "Content-Type: application/pdf" далее предобразование в двоичные данные Base64Значение(СтрокаBase32)
Но блин проблема файл 6 МБ открывается 3 минуты. Есть мысли как ускорить?

============
ЧтениеТекста = Новый ЧтениеТекста(Файл.ПолноеИмя, КодировкаТекста.ANSI);
ТекущаяСтрока = ЧтениеТекста.ПрочитатьСтроку();
    Пока ТекущаяСтрока <> Неопределено Цикл
.
.
1 acht
 
31.10.21
11:41
Тормозят две последние точки в приведенном коде.
2 Кирпич
 
31.10.21
11:50
Ну попробуй ЧтениеДанных и потоки там всякие
3 Кирпич
 
31.10.21
11:51
ПрочитатьДо() там есть
4 acht
 
31.10.21
11:58
Вангую, что там получается 6 мегабайтная строка без разделителей строк. Над которой пытаются измываться разными конкатенациями.
5 Злопчинский
 
31.10.21
12:02
"текстовый файл, ...из него ... вложение в двоичных данных".
этак все файлы можно считать текстовыми. даже экзешники...
6 serg999
 
31.10.21
12:04
(4) )))

=========
    ЧтениеТекста = Новый ЧтениеТекста(Файл.ПолноеИмя, КодировкаТекста.ANSI);
    ТекущаяСтрока = ЧтениеТекста.ПрочитатьСтроку();
    МассиДД = Новый Массив;
    
    Сообщить ("Начало:" + ТекущаяДата());
    Пока ТекущаяСтрока <> Неопределено Цикл
         ТекущаяСтрока = ЧтениеТекста.ПрочитатьСтроку();
        Если СтрНачинаетсяС(ТекущаяСтрока, "Content-Transfer-Encoding: base64") Тогда
            СтрокаБазе64 = "";
            ТекущаяСтрокаДД = ЧтениеТекста.ПрочитатьСтроку();
            Пока ТекущаяСтрокаДД <> Неопределено Цикл
                ТекущаяСтрокаДД = ЧтениеТекста.ПрочитатьСтроку();
                Если СтрНачинаетсяС(ТекущаяСтрокаДД, "--") Тогда
                    Прервать;
                КонецЕсли;    
                СтрокаБазе64 = СтрокаБазе64 + ТекущаяСтрокаДД
            КонецЦикла;
            МассиДД.Добавить(Base64Значение(СтрокаБазе64));
        КонецЕсли;
        
    КонецЦикла;
    Сообщить ("Конец:" + ТекущаяДата());
===
Начало:31.10.2021 14:00:53
Конец:31.10.2021 14:03:58
7 serg999
 
31.10.21
12:05
Пример файла

==========
Content-Type: application/pdf;
    name="=?koi8-r?B?Mjg1Ny0yMTQg2sHQ0s/TLnBkZg==?="
Content-Description: =?koi8-r?B?Mjg1Ny0yMTQg2sHQ0s/TLnBkZg==?=
Content-Type: application/pdf;
    filename="=?koi8-r?B?Mjg1Ny0yMTQg2sHQ0s/TLnBkZg==?="; size=166477;
    creation-date="Thu, 28 Oct 2021 09:48:30 GMT";
    modification-date="Thu, 28 Oct 2021 09:48:30 GMT"
Content-Transfer-Encoding: base64

JVBERi0xLjUNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFu
.
.

Qzk+PDYyOTAwNTJBMUU3QjJFNDA4ODE0RjlGRUJEQUMyMUM5Pl0gL1ByZXYgMTYzMDE0L1hSZWZT
dG0gMTYyNDY0Pj4NCnN0YXJ0eHJlZg0KMTY2Mjk0DQolJUVPRg==

--_007_1FCF3D68AE15F24B9F4C827CBE508A16307BD754MZMAIL02MZISloc_

==========
8 Кирпич
 
31.10.21
12:05
(0) Тебе зачем строки читать, если у тебя задача не строки читать?
9 acht
 
31.10.21
12:06
(6) > СтрокаБазе64 = СтрокаБазе64 + ТекущаяСтрокаДД

Вот тут и тормозит.
У тебя постоянно память перевыделяется
10 serg999
 
31.10.21
12:08
(9) какие варианты ?
11 serg999
 
31.10.21
12:11
(8) Задача вытащить отправителя, вложение, тему письмо ..
Какие варианты, если не перебором строк ?
12 acht
 
31.10.21
12:13
(10) В (2) же написано.

Читай через чтение данных с текущей позиции до разделителя. В момент обработки заголовков - до переноса строки, в момент чтения двоичных данных - до переноса строки и "--".

Ну и какой-нибудь ПолучитьБуферДвоичныхДанныхИзBase64БуфераДвоичныхДанных
13 Кирпич
 
31.10.21
12:14
(11) Ты читаешь вообще, что тебе пишут? В (2) тебе чем не вариант?
Можно еще весь файл в строку и там найти начало и конец твоего pdf и вырезать в строку. Но лучше (2)
14 acht
 
31.10.21
12:14
(11) Хочешь через строки - добавляй каждую прочитанную строку в массив, потом СтрСоединить. Расход памяти при этом, правда, в потолок улетит.
15 serg999
 
31.10.21
12:18
Блин .. да понял мыль, я просто зациклился на переборе ..
Сейчас проверю через ЧтениеДанных..
16 serg999
 
31.10.21
12:21
(14) Тоже думал загнать в массив и собирать строки через "СтрСоединить", так даже  удобнее для разбора было, но решил, что так не комильфо .. не рационально весь файл в памяти держать :(
17 Кирпич
 
31.10.21
12:22
Можешь еще вместо "СтрокаБазе64 = СтрокаБазе64 + ТекущаяСтрокаДД" писать в файл, а потом готовый файл куда хошь. Памяти жрать будет меньше.
18 RomanYS
 
31.10.21
12:25
(0) с помощью ЧтениеТекста делал десятки тысяч замен в гигабайтных файлах за считанные минуты.
В то, что проблема в 6МБ и этих двух строках, никогда не поверю.
19 serg999
 
31.10.21
12:29
(18) Тык уже написали в чем проблема (9)
20 acht
 
31.10.21
12:33
(18) > делал десятки тысяч замен в гигабайтных файлах за считанные минуты

А как Си-лучи мерцают во тьме близ врат Тангейзера - не видел?
21 serg999
 
31.10.21
13:33
Мужики спасибо за помощь! Сделал через ВременныйФайл, обработка меньше секунды ..
Тема закрыта.
22 acht
 
31.10.21
13:48
2 + 2 = 3.9999999999999999999999999999999...