|
#1
|
|||
|
|||
Парсинг данных
Здравствуйте, в Memo имеется примерно такой текст:
Код HTML:
Как спарсить нужные значения, не все а например "SA":Эти цифры, и "ZSD":Эти цифры,. И вывести их в строки listbox Помогите советом. |
#2
|
|||
|
|||
Что-то это на 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
|
||||
|
||||
Код:
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; Код:
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]]]); Цитата:
Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. Последний раз редактировалось dr. F.I.N., 24.02.2019 в 10:15. |
#4
|
|||
|
|||
Цитата:
Да нет, оно еще и на : реагирует. Короче, если есть опасность нарваться на непонятное поведение, лучше написать другой код. Тем более, что он не сложный. |
#5
|
||||
|
||||
Цитата:
Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#6
|
||||
|
||||
А вот еще вариант, регулярные выражения:
Код:
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
|
|||
|
|||
Всем спасибо за ответы, было интересно попробовать и так и так.
|