|
Медленный разбор файла (Последовательный доступ к тексту) | ☑ | ||
---|---|---|---|---|
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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |