Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 16.07.2017
Сообщений: 54

Парсинг текста

31.05.2022, 20:49. Показов 3791. Ответов 66

Студворк — интернет-сервис помощи студентам
Вечера Вам, мудрые филины!
Я любитель в дельфи, но загорелся задачей получить входящий номер астериска.
Подключаюсь по телнету, авторизовываюсь, события вижу вида:

Event: Newstate
Privilege: call,all
Channel: SIP/200-00000181
ChannelState: 5
ChannelStateDesc: Ringing
CallerIDNum: 200
CallerIDName: 200
ConnectedLineNum: 79120000000
ConnectedLineName: 222222_IN_79120000000
Language: ru
AccountCode:
Context: 222222
Exten: 200
Priority: 1
Uniqueid: 1654018920.863
Linkedid: 1654018908.862

Подскажите пожалуйста как мне написать парсинг, чтобы например в memo1 упало только 79120000000.
При этом, соблюдалось условие, что
channel: SIP/200-*
Event: Newstate

По человечески, при входящем на 200 отлавливался номер из ConnectedLineNum:
И падал в memo1
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.05.2022, 20:49
Ответы с готовыми решениями:

Парсинг текста
Хай всем вернее доброй ночи! вот кодес var msg,paramdown1,paramdown2,id:string; begin id :='1g6j'; msg :=id+' >скачать...

Парсинг Текста
Ребят кто поможет сделать правильный парсинг текста вот что есть <td><span class="up_c"> США </span></td> ...

Парсинг текста
{"access_token":"91b81e63e14a5814ac45c7987a37d7561e29e0c178b7f89c33431514642759a65fa784c291632f0781956","expires_in":0,"user_id":285490918}...

66
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
15.06.2022, 00:09
Студворк — интернет-сервис помощи студентам
Итак я реализовал два варианта. Первый вариант, получение всех событий удовлетворяющего условиям и выбор из них последнего и вариант поиска первого же события удовлетворяющего условию.
Первый вариант затратнее по памяти, т.к. помещаются все события, второй вариант экономнее. По мне, так первый вариант более практичный.
ПС: Это вы лог работы транковых радиостанций что-ли обрабатываете?
0
0 / 0 / 0
Регистрация: 16.07.2017
Сообщений: 54
15.06.2022, 01:13  [ТС]
Пытливый, нет, стнадартной IP АТС астериск)
Я не уверен что оба варианта будут емкие по памяти, поэтому вопрос функционала и надежности в приоритете. Я за практичность.
Дадите взглянуть на Вашу живопись?
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
15.06.2022, 01:59
Как сказал классик "Остапа понесло". Вот что в итоге получилось
Вложения
Тип файла: rar LogViewer.rar (170.5 Кб, 2 просмотров)
0
0 / 0 / 0
Регистрация: 16.07.2017
Сообщений: 54
15.06.2022, 09:10  [ТС]
Пытливый, огонь! попробую применить Ваш код, напишу обязательно
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
15.06.2022, 13:38
Цитата Сообщение от D1973 Посмотреть сообщение
Вот эта структура всегда такова: блоки отделяются друг от друга пустой строкой, в блоке 16 строк?
Цитата Сообщение от oleg-jaguar Посмотреть сообщение
В блоке 16 строк, да.
Цитата Сообщение от oleg-jaguar Посмотреть сообщение
Asterisk Call Manager/2.10.5
Response: Success
Message: Authentication accepted
Event: FullyBooted
Privilege: system,all
Status: Fully Booted
Response: Success
Events: On
Event: Newstate
Privilege: call,all
Channel: SIP/222222_59155900-00000c68
ChannelState: 4
ChannelStateDesc: Ring
CallerIDNum: 79129999999
CallerIDName: 79129999999
ConnectedLineNum: <unknown>
ConnectedLineName: <unknown>
Language: ru
AccountCode:
Context: from-trunk-sip-222222_59155900
Exten: 59155900
Priority: 1
Uniqueid: 1655232114.7178
Linkedid: 1655232114.7178
а тут и блок не тот и строк не 16
поэтому я и говорю, что верить на слово - дурной тон.
0
0 / 0 / 0
Регистрация: 16.07.2017
Сообщений: 54
15.06.2022, 13:50  [ТС]
krapotkin, Речь о нашем блоке шла, остальные блоки с другой структурой и количеством строк нас не интересуют) Но да, наверное это тоже описывать надо)
0
Модератор
 Аватар для D1973
9954 / 6489 / 2461
Регистрация: 21.01.2014
Сообщений: 27,489
Записей в блоге: 3
15.06.2022, 14:41
Цитата Сообщение от oleg-jaguar Посмотреть сообщение
наверное это тоже описывать надо
oleg-jaguar, Вам в партизаны надо: сколько уже пытаем, а полной информации так и нет, раз от разу что-то новое всплывет. Дали бы уже полный файл, давно вопрос решен был бы...
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
15.06.2022, 15:19
Да не надо ничего описывать, я же пример проекта ранее привел, читает все структуры, без описаний. Могу скомпилированный файл прикрепить, что бы посмотреть, если у вас не собирается мой проект.
Вложения
Тип файла: rar LogViewer.rar (1.02 Мб, 6 просмотров)
0
0 / 0 / 0
Регистрация: 16.07.2017
Сообщений: 54
15.06.2022, 16:44  [ТС]
Пытливый, D1973,
как бы вам пивко поставить в холодильники холодное )
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
15.06.2022, 17:14
Цитата Сообщение от oleg-jaguar Посмотреть сообщение
как бы вам пивко поставить в холодильники холодное
Я не жадный, помогаю за Спасибо.
0
1234 / 424 / 107
Регистрация: 31.03.2012
Сообщений: 1,159
15.06.2022, 20:50
на регулярных выражениях (D7, консоль)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
{$apptype console}
{.$define  debug}
uses
  windows, SysUtils, Classes,
  PerlRegEx;
 
var
  reExt, reInt: TPerlRegEx; // reExternal, reInternal
  s :string;
 
begin
  with TMemoryStream.Create do try
    // содержимое этого файла соответствует тексту из 28 поста
    LoadFromFile(ChangeFileExt(ParamStr(0), '.txt'));
 
    SetLength(s, Size);
    StrCopy(@s[1], Memory);
  finally Free;
  end; { end try / with }
 
  reExt := TPerlRegEx.Create;
  reInt := tperlregex.Create;
  try
    reInt.RegEx := 'Channel: SIP/200-';
    reInt.Options := [preCaseless, preMultiLine, preSingleLine];
 
    reExt.RegEx := '(?<=(Event: Newstate))(\n|.)+?ConnectedLineNum: ([^\n]+)';
    reExt.Options := [preCaseless, preMultiLine, preSingleLine];
    reExt.Subject := s;
    if reExt.Match then repeat
      {$ifdef debug}
      // Внешний блок содержит текст после строки "Event: Newstate" и до "ConnectedLineNum" включительно
      Writeln('DEBUG'#13#10'reExt.MatchedText:', reExt.MatchedText);
      {$endif}
 
      reInt.Subject := reExt.MatchedText;
      if reInt.Match then // содержит ли внешний блок - "Channel: SIP/200-"
        Writeln('found what we need: ', reExt.Groups[3]);
      { end if }
 
      Writeln;
    until not reExt.MatchAgain; { end repeat / if }
  finally reInt.Free; reExt.Free;
  end;
 
end.
0
0 / 0 / 0
Регистрация: 16.07.2017
Сообщений: 54
16.06.2022, 09:37  [ТС]
Joeymax, StrCopy(@s[1], Memory);
вот тут ругацца

Добавлено через 1 минуту
Пытливый, целую программу написали ))
буду разбираться что там к чему и как теперь это завернуть в свою прогу) но работает как надо
0
1234 / 424 / 107
Регистрация: 31.03.2012
Сообщений: 1,159
16.06.2022, 15:33
Цитата Сообщение от oleg-jaguar Посмотреть сообщение
вот тут ругацца
D7. попробуй явно указать модуль , см. картинку
Миниатюры
Парсинг текста  
0
0 / 0 / 0
Регистрация: 16.07.2017
Сообщений: 54
16.06.2022, 20:45  [ТС]
Joeymax, а можно для более тупого?) на что обратить внимание?
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
16.06.2022, 21:39
Цитата Сообщение от oleg-jaguar Посмотреть сообщение
а можно для более тупого?) на что обратить внимание?
Delphi
1
SysUtils.StrCopy(@s[1], Memory);
Бывает, что в разных модулях используются функции с одинаковыми именами, поэтому приходится явно указывать имя модуля из которого надо брать функцию. Вот только не думаю, что у вас ошибка исчезнет в этом случае. StrCopy вроде как нигде кроме SysUtils и не упоминается.

Добавлено через 5 минут
И еще момент. Вы откуда качали PerlRegEx? Он ведь не входит в стандартную поставку D7.
0
1234 / 424 / 107
Регистрация: 31.03.2012
Сообщений: 1,159
16.06.2022, 22:42
Цитата Сообщение от Пытливый Посмотреть сообщение
Вы откуда качали PerlRegEx
это мне?, на вики embarcadero последняя ссылка из раздела see also
или, что то же самое: здесь
0
 Аватар для mr-Crocodile
3054 / 1673 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
17.06.2022, 10:06
Цитата Сообщение от Joeymax Посмотреть сообщение
это мне?
а это у Вас возникает ошибка?
нет, разумеется, это вопрос oleg-jaguar,
потому что у него ошибка:
Цитата Сообщение от oleg-jaguar Посмотреть сообщение
Delphi
1
StrCopy(@s[1], Memory);
вот тут ругацца
0
0 / 0 / 0
Регистрация: 16.07.2017
Сообщений: 54
17.06.2022, 23:40  [ТС]
mr-Crocodile, качал по ссылке, положил в папку с программой.
Вот скрин с ошибками
Миниатюры
Парсинг текста  
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
18.06.2022, 00:55
1. У вас используется не D7, а более новая версия XE и вам качать сторонний модуль не требуется.
2. Новая версия работает с юникодом и потому код немного надо изменить:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
uses
  SysUtils, Classes, System.RegularExpressionsCore;
 
var
  reExt, reInt: TPerlRegEx;
  S: String;
  MS: TMemoryStream;
 
begin
  MS := TMemoryStream.Create;
  MS.LoadFromFile('D:\Work\Cyberforum\5\Log.txt');
  SetString(S, PAnsiChar(MS.Memory), MS.Size);
  MS.Free;
 
  reExt := TPerlRegEx.Create;
  reInt := TPerlRegEx.Create;
  try
    reInt.RegEx := 'Channel: SIP/200-';
    reInt.Options := [preCaseless, preMultiLine, preSingleLine];
 
    reExt.RegEx := '(?<=(Event: Newstate))(\n|.)+?ConnectedLineNum: ([^\n]+)';
    reExt.Options := [preCaseless, preMultiLine, preSingleLine];
    reExt.Subject := s;
    if reExt.Match then repeat
      {$ifdef debug}
      // Внешний блок содержит текст после строки "Event: Newstate" и до "ConnectedLineNum" включительно
      Writeln('DEBUG'#13#10'reExt.MatchedText:', reExt.MatchedText);
      {$endif}
 
      reInt.Subject := reExt.MatchedText;
      if reInt.Match then // содержит ли внешний блок - "Channel: SIP/200-"
        Writeln('found what we need: ', reExt.Groups[3]);
      { end if }
 
      Writeln;
    until not reExt.MatchAgain; { end repeat / if }
  finally
    reInt.Free;
    reExt.Free;
  end;
  ReadLn;
end.
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
18.06.2022, 01:51
Цитата Сообщение от Joeymax Посмотреть сообщение
StrCopy(@s[1], Memory);
Опять это "ЦареГороховая" процедура. Да ещё и с собачкой.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.06.2022, 01:51

Парсинг текста в StringList
Приветствую, подскажите пожалуйста, как в StringList найти текст в указанном блоке и теге, и заменить его на новый из Мемо? Блок - это...

Парсинг текста в файле
Здравствуйте выручите пожалуйста , нужна срочно программа работы с текстом сам я новичок в этом деле, вообщем перехожу к делу Нужна...

Парсинг текста между тегами <b></b>
В веб браузере delphi загружена страница как достать все Элементы в теге &lt;b&gt;1204884&lt;/b&gt;...

Парсинг текста: получить значения в скобках
Здравствуйте Имеется строка: Param(123)Param(234)Param()...Param(333) Необходимо вытащить значения 123,234. Пробовал через...

Парсинг текста и назначение цвета, RichEdit
Здравствуйте. Есть такая строка: &quot;^ffcb4aТекст1 \r^ffffffТекст2 \r \r^ffcb4aТекст3 \r^ffffffТекст4 ^00ffffТекст5 \r^ffffffТекст6...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru