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

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

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

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

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

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

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

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

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