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