Вход | Регистрация
 

как прочитать текстовый файл с конца

как прочитать текстовый файл с конца
Я
   АртемП
 
05.03.21 - 14:39
В текстовый файл пишется лог.
В котором вставки xml-структуры.
нужно анализировать его.
Но так как файл большой, надо анализировать с конца.

А как читать текстовый файл с конца.
Были рекомендации куда то его считать и там анализировать.
но это не то
   VladZ
 
1 - 05.03.21 - 14:48
(0) Что хочешь вытащить из лога?
   mistеr
 
2 - 05.03.21 - 14:48
Насколько большой?
Если до 10 Мб, вполне можно прочитать в ТекстовыйДокумент и анализировать строки. Это же временно.
   polosov
 
3 - 05.03.21 - 14:52
КоличествоСтрок = ТекстДок.КоличествоСтрок();

Для Инд = 1 ПО ТекстДок.КоличествоСтрок() Цикл 

СтрокаФайла = ТекстДок.ПолучитьСтроку(КоличествоСтрок);
...
...
...

КоличествоСтрок = КоличествоСтрок - 1;

КонецЦикла;
   fisher
 
4 - 05.03.21 - 15:33
Средствами 1С кажись нет способов. Придется что-то внешнее задействовать.
   fisher
 
5 - 05.03.21 - 15:34
(3) Это только для маленьких файлов канает. При такой технике файл вычитывается в память полностью.
   fisher
 
6 - 05.03.21 - 15:37
Хотя стоп.
   fisher
 
7 - 05.03.21 - 15:38
Я с потоками особо не работал.
Вот это вот 

Поток (Stream)
Прочитать (Read)
Синтаксис:
Прочитать(<Буфер>, <ПозицияВБуфере>, <Количество>)

Если оно аккуратно читает с указанной позиции файла, тогда через него можно.
   fisher
 
8 - 05.03.21 - 15:42
Вернее не здесь, в Поток.Перейти()
   H A D G E H O G s
 
9 - 05.03.21 - 15:54
Поток=Новый ФайловыйПоток("E:\tmp1\Уведомление.txt",РежимОткрытияФайла.Открыть);
    РазмерПорции=4000;
    Поток.Перейти(0,ПозицияВПотоке.Конец);
    
    НакопленноеСмещение=0;
    Разделитель=Символы.ПС;
    ПотенциальныйОстатокНаСледующийЦикл="";
    ТекущийРезультат="";
    Буфер=Новый БуферДвоичныхДанных(РазмерПорции);
    
    Пока Истина Цикл
        ТекущееСмещение=мин(РазмерПорции,Поток.ТекущаяПозиция());
        ТекущийРазмерПорции=мин(ТекущееСмещение,РазмерПорции);
        Если ТекущийРазмерПорции<РазмерПорции Тогда//Нам нужен буфер поменьше

            Буфер=Новый БуферДвоичныхДанных(ТекущийРазмерПорции);
        КонецЕсли;
        Поток.Перейти(-ТекущееСмещение,ПозицияВПотоке.Текущая);
        Поток.Прочитать(Буфер,0,ТекущийРазмерПорции);
        Поток.Перейти(-ТекущееСмещение,ПозицияВПотоке.Текущая);//Вернемся назад

        
        ОбщаяСтрока=ПолучитьСтрокуИзБуфераДвоичныхДанных(Буфер);
        МассивСтрок=СтрРазделить(ОбщаяСтрока,Разделитель);        
            
        Если МассивСтрок.Количество()>0 Тогда
            Если ПотенциальныйОстатокНаСледующийЦикл<>"" И МассивСтрок[МассивСтрок.ВГраница()]<>"" Тогда//учтем, что могло прийти с прошлого цикла

                МассивСтрок[МассивСтрок.ВГраница()]=МассивСтрок[МассивСтрок.ВГраница()]+ПотенциальныйОстатокНаСледующийЦикл;
                ПотенциальныйОстатокНаСледующийЦикл="";
            КонецЕсли;
            ПотенциальныйОстатокНаСледующийЦикл=МассивСтрок[0];
            Для Счетчик=0 По МассивСтрок.ВГраница() Цикл                
                ТекущаяСтрока=МассивСтрок[Счетчик];                
                Если Лев(СОКРЛП(ТекущаяСтрока),14)="<?xml version=" Тогда// Нашли, что искали

                    ВитеНужноВыйти=Истина;
                    ТекущийРезультат=""//Мы уже что то накопили в текущем результате, но Вите нужно выйти и мы почистим это

                КонецЕсли;
                ТекущийРезультат=ТекущийРезультат+ТекущаяСтрока+Разделитель;
            КонецЦикла;
            ОкончательныйРезультат=ОкончательныйРезультат+ТекущийРезультат;
            ТекущийРезультат="";
            Если ВитеНужноВыйти=Истина Тогда
                Прервать;
            КонецЕсли;
            
        КонецЕсли;
        
        Если Поток.ТекущаяПозиция()=0 Тогда
            Прервать;
        КонецЕсли;
    
    КонецЦикла;
   H A D G E H O G s
 
10 - 05.03.21 - 15:56
Добро пожаловать в мир классических ЯП
   fisher
 
11 - 05.03.21 - 16:00
(9) "ВитеНужноВыйти" лучше явно проинициализировать.
ЗЫ. Рад, что ты по-прежнему молод душой :) Обычно юмор в коде приедается на первом году программирования и дальше уже считается моветоном.
   mikecool
 
12 - 05.03.21 - 16:01
(0) не получается парсить xml?
   SirLewis
 
13 - 05.03.21 - 16:02
Напишите простую программу на "плюсах", там это в две функции делается. [url=https://barbershop.ck.ua/]Мне[/url] пригодилось
   H A D G E H O G s
 
14 - 05.03.21 - 16:02
(11) Ну Витя - это классика
https://youtu.be/oScT2PkOm_s
   fisher
 
15 - 05.03.21 - 16:06
(9) Реально быстро читает для больших файлов? Если пару гигов скормить, последние пару килобайт мгновенно вычитает?
   H A D G E H O G s
 
16 - 05.03.21 - 16:14
(15) Епстественно. Это же просто обертка над CreateFile/ReadFile
Гиговый файл прочитал мгновенно
   fisher
 
17 - 05.03.21 - 16:19
(16) Отлично!
   АртемП
 
18 - 05.03.21 - 17:32
(9) блин код большой. но попробую
   АртемП
 
19 - 05.03.21 - 17:33
(12)до парсенья xml надо этот лог файл расчленить на массив транзакций
   fisher
 
20 - 05.03.21 - 17:33
(18) Да. Тяжело тебе придется. Ведь это еще и не весь код :)
   АртемП
 
21 - 05.03.21 - 17:39
(20)да пипец

Как я понял - это текстовый фай, в котором через куски разделителей пишутся логи в виде кусков xml.
т.е. надо почленить лог на транзакции и дальше вычленять эти куски xml и вычленять из них номера транзакций, статусы и возвраты сообщений
   fisher
 
22 - 05.03.21 - 17:41
(21) То есть придется целую программку написать? Да. В такие дни хоть увольняйся.
   АртемП
 
23 - 05.03.21 - 17:42
(22)да! И еще нужно отслеживать изменение этого логфайла
   Исновая
 
24 - 05.03.21 - 17:53
Переверни


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.