Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   [Delphi] Вопрос на засыпку 2 (https://forum.antichat.xyz/showthread.php?t=183783)

RedFern.89 04.03.2010 02:51

[Delphi] Вопрос на засыпку 2
 
конечно туповато такое спрашивать, однако мне нужна помощь ваша. вопрос. Как с помощью операторов Copy, Pos, Delete, Length сделать список из этого?

Код:

{"countries":[[19,"Австралия"],[20,"Австрия"],[5,"Азербайджан"],[21,"Албания"],[22,"Алжир"],[23,"Американское Самоа"],[24,"Ангилья"],[25,"Ангола"],[26,"Андорра"],[27,"Антигуа и Барбуда"],[28,"Аргентина"],[6,"Армения"],[29,"Аруба"],[30,"Афганистан"],[31,"Багамы"],[32,"Бангладеш"],[33,"Барбадос"],[34,"Бахрейн"],[3,"Беларусь"],[35,"Белиз"],[36,"Бельгия"],[37,"Бенин"],[38,"Бермуды"],[39,"Болгария"],[40,"Боливия"]
RegExpr не предлогать))

wolmer 04.03.2010 03:44

Код (в коде думаю ты сам разберешься, а если не сможешь разобраться -> моя личка открыта):
Код:

procedure TForm1.FormCreate(Sender: TObject);
var
 s:string;
 current_int, current_name:string;
 goroda:array [1..100] of string;//за назв. переменной не ругать  :D
begin
 s:='{"countries":[[19,"Австралия"],[20,"Австрия"],[5,"Азербайджан"],[21,"Албания"]';

 delete(s, 1, 14);

 while 1<>2 do
  begin
    current_int:=copy(s, pos('[', s)+1, pos(',', s)-1-pos('[', s));
    current_name:=copy(s, pos('"', s)+1, pos('"]', s)-1-pos('"', s));
    goroda[strtoint(current_int)]:=current_name;
    if length(s)-pos('"]', s)=1 then
    begin
      break;
    end
    else
    begin
      delete(s, 1, 1+length(current_int)+2+length(current_name)+3);
    end;
  end;
end;


GhostOnline 04.03.2010 10:57

Цитата:

RegExpr не предлогать))
Интересно, почему?

RedFern.89 04.03.2010 11:42

Цитата:

Сообщение от GhostOnline
Интересно, почему?


зачем мне RegExpr для таких протстых операций?))

M_script_ 04.03.2010 12:07

Цитата:

Сообщение от RedFern.89
конечно туповато такое спрашивать, однако мне нужна помощь ваша. вопрос. Как с помощью операторов Copy, Pos, Delete, Length сделать список из этого?

Какого вида список нужно сделать?

RedFern.89 04.03.2010 12:22

при загрузке больших данных, вылетает с ошибкой is not valid integer value. я попробую сам разобраться. спасибо!

RedFern.89 04.03.2010 12:23

Цитата:

Сообщение от M_script_
Какого вида список нужно сделать?


просто список стран в столбик))

GhostOnline 04.03.2010 12:29

Цитата:

Сообщение от RedFern.89
зачем мне RegExpr для таких протстых операций?))


Ога, для таких простых операций есть же античат

RedFern.89 04.03.2010 12:35

я могу и сам это сделать. друзей вк получилось разделить)) ну если тебе в лом помочь мне - ладно. я пойму, но наезжать то зачем?

M_script_ 04.03.2010 13:09

Вот решение с помощью TStringList:
Код:

       
AnsiString sTemp = "";
TStringList* CountryList = new TStringList;
sTemp = "{\"countries\":[[19,\"Австралия\"],[20,\"Австрия\"],[5,\"Азербайджан\"],[21,\"Албания\"],[22,\"Алжир\"],[23,\"Американское Самоа\"],[24,\"Ангилья\"],[25,\"Ангола\"],[26,\"Андорра\"],[27,\"Антигуа и Барбуда\"],[28,\"Аргентина\"],[6,\"Армения\"],[29,\"Аруба\"],[30,\"Афганистан\"],[31,\"Багамы\"],[32,\"Бангладеш\"],[33,\"Барбадос\"],[34,\"Бахрейн\"],[3,\"Беларусь\"],[35,\"Белиз\"],[36,\"Бельгия\"],[37,\"Бенин\"],[38,\"Бермуды\"],[39,\"Болгария\"],[40,\"Боливия\"]";
sTemp.Delete(1, sTemp.Pos("[")); // удаляем лишнее
CountryList->Delimiter = ','; // указываем разделитель
CountryList->DelimitedText = sTemp; // текст разбивается на строки, разделителем считаются кавычки  и запятая
for(int i=0; i < CountryList->Count; ++i) // перебираем все полученные строки
          if(CountryList->Strings[i].Pos("[") || CountryList->Strings[i].Pos("]")) // если в строке есть квадратные скобки, удаляем ее
                  CountryList->Delete(i--);
Memo1->Lines->AddStrings(CountryList); // выводим список в мемо
Edit1->Text = CountryList->CommaText; // или в едит через запятую
delete CountryList;

Переписать с сиплюса на делфи не сложно.

GhostOnline 04.03.2010 13:37

Входящая строка в edit1.text:

var
temp : TStringList;
res : tstringlist;
tmp : string;
I: Integer;
begin
temp := TStringList.Create;
res := TStringList.Create;
tmp := StringReplace(edit1.text, '{"countries":[[', '', [rfReplaceAll]);
tmp := StringReplace(tmp, '[', '', [rfReplaceAll]);
tmp := StringReplace(tmp, ']', '', [rfReplaceAll]);
temp.commatext := tmp;
i := 0;
while i < temp.Count do
begin
res.Add(temp[i] + '=' + temp[i+1]);
i := i + 2;
end;

В результате res имеет такой вид:

19=Австралия
20=Австрия
5=Азербайджан
21=Албания
22=Алжир
23=Американское Самоа
24=Ангилья
25=Ангола
26=Андорра
27=Антигуа и Барбуда
28=Аргентина
6=Армения
29=Аруба
30=Афганистан
31=Багамы
32=Бангладеш
33=Барбадос
34=Бахрейн
3=Беларусь
35=Белиз
36=Бельгия
37=Бенин
38=Бермуды
39=Болгария
40=Боливия

Тогда можно иметь такой доступ к номеру и стране:
res.NAmes[i] - номер
res.ValueFromindex[i] - страна

Чтобы просто выводился список стран:

while i < temp.Count do
begin
res.Add(temp[i+1]);
i := i + 2;
end;

RedFern.89 04.03.2010 15:20

спасибо парни! помогли!

Jingo Bo 05.04.2010 21:08

Берешь любой JSON парсер и всё. Могу дать свою реализацию.

JnK 05.04.2010 21:48

PHP код:

function ParserBlock(var Page:string; const Param1,Param2:string):string;
var
  
BeginPos,
  
EndPos:integer;
begin
  BeginPos
:=AnsiPos(Param1,Page)+length(Param1);
  
delete(Page,1,beginPos-1);
  
BeginPos:=AnsiPos(Param1,Page)+length(Param1);
  
EndPos:=AnsiPos(Param2,Page);
  
Result:=copy(page,1,EndPos-1);
end;


procedure TForm1.Button1Click(SenderTObject);
var
  
s:string;
begin
  s
:=edit1.Text;
  
Delete(s,1,pos('[',s));
  while (
length(s)>2) do
  
begin
    Memo1
.Lines.Add(ParserBlock(s,'[',',')+#09+ParserBlock(s,'"','"'));
  
end;
end



Время: 20:08