안녕하세요..^^ ( 속도가 느리다고 해서리 조금 수정해보았습니다. )
흠.. 질답란에도 그렇고 가끔 보면.. Comport나 기타 문열로 주구장창 들어온 내용을 구분자를 이용해서 나누려고 할때 ExtracStrings를 사용합니다.
근데.. 아시듯이 이넘은 몇가지 문제가 있습니다. 뭐 제가 사용법을 몰라서 그럴수도 있구요 ^^;
예를들어 의 경우 #1로 구분자를 넣는경우 2번 내용이 없어서 ‘1번’+#1#1+’3번’을 만들고 이 값을
ExtracStrings하시면 StringList에 ‘1번’, ‘3번’ 만 나오는 것이죠.
의도와는 다른 값이 나와 가끔 당황스럽습니다.
또 한예는 문자 하나로는 불가능 하고 ‘{1}’처럼 2문자 이상의 문자열로 구분자를 주고 싶은 경우 입니다.
이런 경우도 쪼끔 당황 스럽습니다.
이를 보완하고자 만들어본것인데, 몇년된것을 조금 손봐서 다시 만들었습니다.
소스 나갑니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
Function Str2Words( CurrentStr, CutStr : String; StrList : TStringList ) : Integer; Var TS : String; LPos, fPos, i, S_L, C_L : Integer; pStr, tStr, iStr : PCHar; bCut : boolean; Begin S_L := Length( CurrentStr ); C_L := Length( CutStr ); pStr := PChar( CurrentStr ); tSTr := pStr; lPos := 0; fPos := 0; StrList.BeginUpdate; try Repeat bCut := tStr^ = pChar(CutStr)^; If bCut then begin iStr := tSTr; for i := 1 to C_L - 1 do begin inc( iStr ); if iStr^ <> ( pChar( CutStr ) + i )^ then Break; end; if i < C_L Then bCut := False; end; If bCut Then begin SetString( TS, pStr, lPos - fPos ); StrList.Add(Ts); inc( lPos, C_L ); fPos := lPos; Inc( tStr, C_L ); pStr := tStr; end else begin inc( lPos ); inc( tStr ); end; until lPos >= S_L; SetString( TS, pStr, tStr - pStr ); StrList.Add(TS); finally StrList.EndUpdate; end; Result := StrList.Count; End; >>>>>>>>>>>>>>>>사용법<<<<<<<<<<<<<<<<<< procedure TForm1.Button1Click(Sender: TObject); var Str : string StrList: TStringList; begin Str := '1번'+'{구분자}{구분자}'+'3번' StrList := TStringList.Create; Try StrList.Clear; If Str2Words( Str ,'{구분자}', StrList ) > 0 then begin ListBox1.Items.Clear; ListBox1.Items.Assign( StrList ); end; finally freeAndNil( StrList ); end; end |
참고되시기 바랍니다. << 저작자 : 김말동 >>
최신 댓글