PDA

Просмотр полной версии : [Delphi] Вопрос на засыпку 2


RedFern.89
04.03.2010, 02:51
конечно туповато такое спрашивать, однако мне нужна помощь ваша. вопрос. Как с помощью операторов 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
Интересно, почему?


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

M_script_
04.03.2010, 12:07
конечно туповато такое спрашивать, однако мне нужна помощь ваша. вопрос. Как с помощью операторов Copy, Pos, Delete, Length сделать список из этого?

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

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

RedFern.89
04.03.2010, 12:23
Какого вида список нужно сделать?


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

GhostOnline
04.03.2010, 12:29
зачем мне 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
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(Sender: TObject);
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;