Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[14992] [질문]스트링 파싱해서 트리구조로 만들기 - 속도 개선문의?
장현덕 [] 2012 읽음    2014-02-17 00:11
스트링을 파싱해서 트리구조를 만드는 걸 테스트 하는 겁니다.

dll 에서 스트링을 받아 프로그램에서 파싱을 하는 구조로 되어있구스트링을 파싱해서 트리구조를 만드는 걸 테스트 하는 겁니다.

dll 에서 스트링을 받아 프로그램에서 파싱을 하는 구조로 되어있구요.

스트링이 데이터( 그래픽 좌표, 정보 ) 여서 크거든요.

그래서 속도를 높이고 싶어요. ( 코드개선, 획기적 방법등 ) 을 문의 드립니다.




procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
  paircount: integer;
  totalpair: integer;
  token: String;
  c:Pchar;
  IsPairInc: boolean;

  procedure AddOne;
  begin
    token := token + c^;
    Inc(c);
  end;

  procedure Skip;
  begin
    inc(c);
  end;
begin
  s:= '[';
  s:= s + '{root1,{child1, child2, {child3,{c1,c2}}, child4}},';
  s:= s + '{root2,{child1, child2, {child3,{a1,a2,a3}}}},';
  s:= s + '{root3,{{child1,{m1,m2,m3}}, child2, {child3,{a1,a2,a3}}}';
  s:= s + ']';

  c:= Pchar(s);
  paircount := 0;
  token:='';
  Memo1.Lines.Clear;
  IsPairInc := true;

  while c^ <> ']' do
  begin
    case c^ of
      '{': begin
             token := '';
             inc(paircount);
             inc(c);
             IsPairInc := True;
           end;
      '0'..'9', 'a'..'z', 'A'..'Z':
           begin
             AddOne;
           end;
      ',': begin
             if (IsPairInc and (token <> '')) then
               if (c+1)^ = '{' then
               begin
                 Memo1.Lines.Add(inttostr((paircount-1) div 2) + ':' + token);  // add
               end else
                 Memo1.Lines.Add(inttostr(paircount div 2) + ':' + token);      // add
             token:='';
             inc(c);
           end;
      '}': begin
             if paircount <> 0 then IsPairInc := false;
             if ((c+1)^ = '}') and ((c+2)^ <> '}') and (token <> '') then
               Memo1.Lines.Add(inttostr(paircount div 2) + ':' + token);        // add

             if ((c+1)^ = '}') and ((c+2)^ = '}') and (token <> '') then
             begin
               Memo1.Lines.Add(inttostr(paircount div 2) + ':' + token);        // add
               token := '';
               IsPairInc:= True;
             end;
           
             dec(paircount);
             if paircount = 0 then
             begin
               IsPairInc:=true;
               token := '';
               Memo1.Lines.Add('');
             end;

             inc(c);
           end;
      ' ', '[':
           begin
             Skip;
           end;
    end;
  end;

end;



결과

0:root1
1:child1
1:child2
1:child3
2:c1
2:c2
1:child4
--------------------------------
0:root2
1:child1
1:child2
1:child3
2:a1
2:a2
2:a3
--------------------------------
0:root3
1:child1
2:m1
2:m2
2:m3
1:child3
2:a1
2:a2
2:a3


+ -

관련 글 리스트
14992 [질문]스트링 파싱해서 트리구조로 만들기 - 속도 개선문의? 장현덕 2012 2014/02/17
14993     Re:[질문][수정]스트링 파싱해서 트리구조로 만들기 - 속도 개선문의? 김도완 1940 2014/02/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.