![]() |
|
|
#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]]]);Цитата:
Последний раз редактировалось dr. F.I.N., 24.02.2019 в 10:15. |
|
#4
|
|||
|
|||
|
Цитата:
Да нет, оно еще и на : реагирует. Короче, если есть опасность нарваться на непонятное поведение, лучше написать другой код. Тем более, что он не сложный. |
|
#5
|
||||
|
||||
|
Цитата:
|
|
#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
|
|||
|
|||
|
Всем спасибо за ответы, было интересно попробовать и так и так.
|