Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.02.2019, 12:38
pikabu pikabu вне форума
Прохожий
 
Регистрация: 27.12.2017
Сообщения: 30
Версия Delphi: 10.1
Репутация: 10
По умолчанию Парсинг данных

Здравствуйте, в Memo имеется примерно такой текст:
Код HTML:
"SA":50.62,"LV":6.79,"BLB":9.16,"ZSD":7.75,"SHT":11.11,"

Как спарсить нужные значения, не все а например "SA":Эти цифры, и "ZSD":Эти цифры,. И вывести их в строки listbox
Помогите советом.
Ответить с цитированием
  #2  
Старый 23.02.2019, 22:22
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Что-то это на json похоже, хотя не хватает заголовков.
А вообще, можно проще, если это ровно тот текст, который и надо распарсить.
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  src = '"SA":50.62,"LV":6.79,"BLB":9.16,"ZSD":7.75,"SHT":11.11,"';
  ptrn : array [1..2] Of String = ('SA','ZSD');
var
  s, b : string;
  i : integer;
begin
  listbox1.Items.Clear;
  s := src;
  while pos(',',s) > 0 Do
  begin
    b := copy(s,1,pos(',',s)-1);
    s := copy(s,pos(',',s)+1,length(s));
    for i := low(ptrn) to high(ptrn) do
      if pos(ptrn[i],b) > 0
        then listbox1.Items.Add(b);
  end;
end;

PS. Для тех, кто считает, что через Delimiter и DelimitedText будет проще - попробуйте. Будите сильно удивлены результатом. По крайней мере в Delphi 10.2 TStringList пытается в этом случае парсить стоку как будто это CSV, что, как я понял, не совсем то, что ТС надо.
Ответить с цитированием
  #3  
Старый 24.02.2019, 10:06
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Код:
const
  src = '"SA":50.62,"LV":6.79,"BLB":9.16,"ZSD":7.75,"SHT":11.11';
var
  i: Integer;
begin
  with TStringList.Create do
  try
    Delimiter := ',';
    QuoteChar := #0;
    NameValueSeparator := ':';
    DelimitedText := src;
    for i := 0 to Count - 1 do
     ShowMessageFmt('%d. Name: %s; Value: %s', [i+1, Names[i], ValueFromIndex[i]]);
  finally
    Free;
  end;
end;
Ну а дальше сверяете Names[i] с нужными Вам. Например:
Код:
const
...
  ptrn: array[0..1] of string = ('"SA"', '"ZSD"');
...
  for i := Low(ptrn) to High(ptrn) do
      ShowMessageFmt('Pattern: %s; Value: %s', [ptrn[i], Values[ptrn[i]]]);
Цитата:
PS. Для тех, кто считает, что через Delimiter и DelimitedText будет проще - попробуйте.
Это происходит из-за QuoteChar, который по-умолчанию равен ". А можно изначально удалить эти кавычки: DelimitedText := StringReplace(src, '"', '', [rfReplaceAll]);
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.

Последний раз редактировалось dr. F.I.N., 24.02.2019 в 10:15.
Ответить с цитированием
  #4  
Старый 24.02.2019, 12:03
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от dr. F.I.N.
Это происходит из-за QuoteChar, который по-умолчанию равен ". А можно изначально удалить эти кавычки: DelimitedText := StringReplace(src, '"', '', [rfReplaceAll]);

Да нет, оно еще и на : реагирует. Короче, если есть опасность нарваться на непонятное поведение, лучше написать другой код. Тем более, что он не сложный.
Ответить с цитированием
  #5  
Старый 24.02.2019, 13:34
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Цитата:
Сообщение от lmikle
Да нет, оно еще и на : реагирует. Короче, если есть опасность нарваться на непонятное поведение, лучше написать другой код. Тем более, что он не сложный.
Ну не знаю. Попробовал и в D7 и в RAD10.3 результат идентичен.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #6  
Старый 26.02.2019, 16:44
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 339
Версия Delphi: 10.4
Репутация: 429
Сообщение

А вот еще вариант, регулярные выражения:

Код:
uses
RegularExpressions;

procedure TForm1.Button1Click(Sender: TObject);
var
  RegEx: TRegEx;
  MatchColl: TMatchCollection;
  I: LongInt;
begin
  RegEx := TRegEx.Create('"SA":\d+\W\d+|"ZSD":\d+\W\d+');
  if RegEx.IsMatch(Memo1.Text) then
    begin
      MatchColl := RegEx.Matches(Memo1.Text);
      for I := 0 to MatchColl.Count - 1 do
        begin
          ListBox1.Items.Add(MatchColl.Item[i].Value);
        end;
    end;
end;
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #7  
Старый 01.03.2019, 18:35
pikabu pikabu вне форума
Прохожий
 
Регистрация: 27.12.2017
Сообщения: 30
Версия Delphi: 10.1
Репутация: 10
По умолчанию

Всем спасибо за ответы, было интересно попробовать и так и так.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:20.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter