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