[Delphi] Вопрос на засыпку 2

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by RedFern.89, 4 Mar 2010.

  1. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    557
    Likes Received:
    45
    Reputations:
    0
    конечно туповато такое спрашивать, однако мне нужна помощь ваша. вопрос. Как с помощью операторов Copy, Pos, Delete, Length сделать список из этого?

    Code:
    {"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 не предлогать))
     
  2. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    438
    Likes Received:
    97
    Reputations:
    9
    Код (в коде думаю ты сам разберешься, а если не сможешь разобраться -> моя личка открыта):
    Code:
    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;
     
    #2 wolmer, 4 Mar 2010
    Last edited: 5 Apr 2010
    1 person likes this.
  3. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Интересно, почему?
     
  4. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    557
    Likes Received:
    45
    Reputations:
    0

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

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    Какого вида список нужно сделать?
     
  6. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    557
    Likes Received:
    45
    Reputations:
    0
    при загрузке больших данных, вылетает с ошибкой is not valid integer value. я попробую сам разобраться. спасибо!
     
  7. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    557
    Likes Received:
    45
    Reputations:
    0

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

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22

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

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    557
    Likes Received:
    45
    Reputations:
    0
    я могу и сам это сделать. друзей вк получилось разделить)) ну если тебе в лом помочь мне - ладно. я пойму, но наезжать то зачем?
     
  10. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    Вот решение с помощью TStringList:
    Code:
    	
    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;
    
    Переписать с сиплюса на делфи не сложно.
     
  11. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Входящая строка в 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 + '=' + 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 - номер
    res.ValueFromindex - страна

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

    while i < temp.Count do
    begin
    res.Add(temp[i+1]);
    i := i + 2;
    end;
     
    #11 GhostOnline, 4 Mar 2010
    Last edited: 4 Mar 2010
    1 person likes this.
  12. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    557
    Likes Received:
    45
    Reputations:
    0
    спасибо парни! помогли!
     
  13. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Берешь любой JSON парсер и всё. Могу дать свою реализацию.
     
  14. JnK

    JnK Elder - Старейшина

    Joined:
    30 Mar 2007
    Messages:
    125
    Likes Received:
    21
    Reputations:
    0
    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;