Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2009, 00:56   #1
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию Составление "списка" из строки

Имеется такая строка (вся строка без пробелов)
{"user":{"id":ХХХХХХХХ},"friends":{ "count":0},"messages":{"count":0}," events":{"count":0},"groups":{"coun t":0},"photos":{"count":0},"videos" :{"count":0},"notes":{"count":0},"o ffers":{"count":0},"questions":{"co unt":0},"gifts":{"count":0},"activi ty":{"updated":0}}
Например в Memo, надо вывести такой список:
id = ХХХХХХХХ
friends = 0
messages = 0
и т.д. (з.ы. вместо 0 могут быть любые другие числа).

Кто может подсказать как это сделать?
Как я понимаю надо воспользоваться функциями для работы со строками, но я не могу понять логику как вытащить, то что мене надо.
Если можно пример начала сего, а дальше уже я может разберусь.
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 25.08.2009 в 00:59.
spamer вне форума Ответить с цитированием
Старый 25.08.2009, 01:29   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Если точно известны имена полей (friends, messages...), то ищете pos'ом поле, затем второе двоеточие после найденной позиции. И берете строку от этого двоеточия до символа '}'. Преобразовываете в число (если нужно).

Если названия полей заранее неизвестны:
ищете первое двоеточие и берете строку до второго - это название поля. Далее как в первом варианте.
После этого снова ищете двоеточие....

Тут удобно использовать posEx (нужно подключить StrUtils) вместо обычного pos'а.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 25.08.2009, 01:46   #3
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

RegExp очень полезная вещь...
TwiX вне форума Ответить с цитированием
Старый 25.08.2009, 02:27   #4
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Названия полей заранее известны.
Вот получил я три первых поля вот так:
Код:
i := PosEx('id', s1, 10);
j := PosEx(':', s1, i);
k := PosEx('}', s1, j);
Caption := Copy(s1, j+1, 8);

i := PosEx('friends', s1, k);
j := PosEx(':', s1, i+10);
k := PosEx('}', s1, j);
Caption := Copy(s1, j+1, 1);

i := PosEx('messages', s1, k);
j := PosEx(':', s1, i+10);
k := PosEx('}', s1, j);
Caption := Copy(s1, j+1, 1);
Но появилась проблема. Если значения полей больше 9, т.е. "count":15 (кроме поля id - оно всегда постоянное), например 15, то выводится только 1. Вопрос: как же вывести все число.

З.Ы.
Цитата:
RegExp очень полезная вещь...
Я никогда с ним не работал.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 25.08.2009, 03:23   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Неправильно делаете вот что:
вы находите символ '}', но вместо того, чтобы использовать это, копируете ровно 1 символ. Надо так:
Код:
Caption := Copy(s1, j+1, k-j-1);
для всех полей.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 25.08.2009, 03:37   #6
Вавел из ГМТУ
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 896
По умолчанию

Процедурка и пример её использования:

Код:
Procedure ParsStroka(Const Log : TMemo; Stroka : String);
Var
  i, LS : Integer;
  RN, RV : Boolean;
  S, SN, SV, Rez : String;
Begin
RV := False; RN := False; Log.Clear;
LS := Length(Stroka); S := Stroka;
For i := 9 To LS Do
  Begin
    If RN = True Then SN := SN + S[i];
    If S[i] = '"' Then
    If RN = False Then RN := True
      Else
        Begin
          RN := False;
          Delete(SN,Length(SN),1);
          If SN <> 'count' Then Rez := SN;
          SN := '';
        End;
    If RV = True Then SV := SV + S[i];
    If ((S[i] = ':') And (S[i+1] <> '{')) Or (S[i] = '}') Then
    If RV = False Then RV := True
      Else
        Begin
          RV := False;
          Delete(SV,Length(SV),1);
          Log.Lines.Add(Rez + ' = ' + SV);
          SV := ''; Rez := '';
        End;
  End;
End;

Procedure TForm1.BClick(Sender: TObject);
Begin
ParsStroka(Memo1, E.Text);
End;
Результат:

id = ХХХХХХХХ
friends = 0
messages = 0
events = 0
coun t = 0
photos = 0
videos = 0
notes = 0
o ffers = 0
co unt = 0
gifts = 0
updated = 0

адд: было сказанно что в строке нету пробелов..... Но они там почемуто есть. Вот например в исходной строке слово сount с пробелом....
Если такое произойдёт, то имя поля (которое должно было вывестись) замениться на count.
Тобишь нужно сначала будет пробежаться по строке и удалить все пробелы.

Последний раз редактировалось Вавел из ГМТУ; 25.08.2009 в 03:46.
Вавел из ГМТУ вне форума Ответить с цитированием
Старый 25.08.2009, 11:54   #7
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Sazary, Вавел из ГМТУ - спасибо обоим.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 25.08.2009, 12:15   #8
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Кажись это JSON, там структура может быть сложнее (вложенные конструкции). Есть куча готовых парсеров, http://sourceforge.net/projects/lkjson/ например
пыщь
JTG вне форума Ответить с цитированием
Старый 25.08.2009, 12:23   #9
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

JTG я получаю запрос с сайта (именно такую строку). и мене надо просто вывести статистику вот эту. Все решилось.

З.Ы. А на счет JSON почитаю, что за сие такое.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
как разделить данные в одной ячейке, которые разделены ";", на строки? Margaritka Microsoft Office Excel 2 10.03.2009 20:16
Неполные строки "едут" в MS Word 2007 при изменении масштаба. mirotvoretc Microsoft Office Word 12 05.03.2009 12:07
блок "cont" с права не принимает значение "margin: 10px;" которое описано в body tabikA HTML и CSS 5 24.02.2009 21:50
Под прикрытием "кризиса" наши доблестные "управители" хотят утопить нас в радиоактивных отходах mihali4 Свободное общение 1 17.01.2009 01:43