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

Форум АНТИЧАТ (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;

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


Время: 19:18